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 + } + } + } + } +}