OverView OutPost

Deploy a pre-configured VM in your DMZ for secure, agentless API access — no VPN setup, no inbound ports

What Is It?

A preconfigured VM that lets OverView securely access your internal APIs without complex VPN configuration. Deploy it in your DMZ, configure firewall rules, and you're done in under 1 hour.

The solution uses Tailscale, a modern mesh VPN built on the WireGuard® protocol.

The name states the role: an outpost is a small forward position, set at the edge of the territory, that observes and reports back to base. It commands nothing, stores nothing, and can be withdrawn without affecting the main position. The OutPost works exactly that way: deployed at the edge of your network, it relays to OverView what you allow it to read, and nothing else.

Key benefits:

  • ✅ No IPSec tunnels or certificates to manage
  • ✅ No inbound ports to open on your firewall
  • ✅ The VM self-configures on first boot
  • ✅ Only OverView can access the OutPost (private network isolation)
  • ✅ You control exactly which APIs are exposed

Ships with: hardened Ubuntu 24.04 LTS VM, Tailscale agent preconfigured for auto-enrollment, automatic security updates (OS + VPN), OverSOC documentation and support.


How It Works

The VM sits in your DMZ and acts as a secure bridge between OverView and your internal APIs. All connections are initiated outbound from the VM — no holes in your firewall.

OverView OutPost architecture diagram

Security model:

PrincipleIn practice
Private network isolationThe OutPost joins OverView's private Tailscale network. Only the OverView platform can reach it — not the public Internet, not other Tailscale users. The OutPost cannot access OverView's infrastructure: it only relays your APIs
Zero Trust by defaultThe VM starts with zero access to your internal network. Every API requires an explicit firewall rule — no lateral movement possible
EncryptionWireGuard (ChaCha20-Poly1305), end-to-end between OverView and your OutPost, automatic key rotation
Data flowDirect peer-to-peer when possible, encrypted relay as fallback. The coordination service (*.tailscale.com) only handles authentication — it does not route your data

Deployment Guide

Prerequisites

  • Hypervisor: VMware vSphere/ESXi, Microsoft Hyper-V, Nutanix AHV, Proxmox VE, or KVM
  • Resources: 2 vCPU, 2 GB RAM, 10 GB storage
  • Network: Outbound internet access, DNS resolution
  • Placement: DMZ or isolated VLAN

Phase 1: Deploy the VM (15 minutes)

The image exists in each supported hypervisor's format — tell OverSOC which one you use before the build. Only one procedure applies: expand the one matching your platform.

VMware ESXi / vSphere.ova file
  1. Open the vSphere Client (web interface)
  2. Right-click the host or cluster > Deploy OVF Template...
  3. Select Local file and choose the provided .ova file
  4. Follow the wizard: name the VM, pick the datastore, select the network (VLAN/portgroup)
  5. Click Finish and wait for the import to complete
  6. Start the VM
Microsoft Hyper-V.vhdx file
  1. Copy the provided .vhdx file onto the Hyper-V host
  2. In Hyper-V Manager, create a new Generation 2 VM and, at the disk step, choose Use an existing virtual hard disk pointing at the .vhdx (the Import Virtual Machine action will not work — it expects an exported VM folder, not a bare disk)
  3. Set the Secure Boot template to Microsoft UEFI Certificate Authority (Settings → Security) — the default Microsoft Windows template refuses to boot Linux:
    Set-VMFirmware "<vm-name>" -SecureBootTemplate MicrosoftUEFICertificateAuthority
    
  4. Configure resources (2 vCPU, 2 GB RAM), connect a virtual switch, start the VM

Generation 1? Tell us before the build: a .vhd is provided instead (same procedure, no Secure Boot setting needed).

Nutanix AHV.qcow2 file
  1. Open Prism Central > Compute & Storage > Images > Add Image
  2. Upload the provided .qcow2 file, type Disk, place it on the target cluster
  3. Go to Compute & Storage > VMs > Create VM
  4. Configure: 2 vCPU, 2 GB RAM, and set the Boot Configuration to UEFI (the image is built for UEFI boot)
  5. Attach a disk: Clone from Image > select the uploaded image
  6. Add a NIC on the desired subnet/VLAN
  7. Save and start the VM
Proxmox VE / KVM.qcow2 file

Proxmox VE

  1. Copy the provided .qcow2 file onto the Proxmox host
  2. Create a VM without a disk: 2 vCPU, 2 GB RAM, BIOS: OVMF (UEFI) with an EFI disk (the image is built for UEFI boot)
  3. Import the image:
    qm importdisk <vmid> ovsgw-*.qcow2 <storage>
    
  4. Attach the imported disk, set it as the boot device
  5. Connect a bridge, start the VM

KVM / libvirt (without Proxmox)

Create and start the VM straight from the image:

virt-install --name overview-outpost --memory 2048 --vcpus 2 \
  --disk /var/lib/libvirt/images/ovsgw.qcow2 --import \
  --osinfo ubuntu24.04 --boot uefi \
  --network bridge=br0 --noautoconsole

Phase 2: Configure the VM Network (5 minutes)

The VM requests an address over DHCP on first boot. Two cases:

With DHCP (default)

Nothing to do: the VM gets its address on its own. Read it off the hypervisor's console banner, then move on to the verification.

Without DHCP — Static IP

  1. Open the hypervisor console and log in with the ubuntu login and the password provided by OverSOC
  2. Edit the network configuration:
    sudo nano /etc/netplan/01-netcfg.yaml
    

    Replace the content with (adapt the addresses to your network):
    network:
      version: 2
      ethernets:
        all-en:
          match:
            name: "en*"
          addresses: [192.0.2.10/24]
          routes:
            - to: default
              via: 192.0.2.1
          nameservers:
            addresses: [8.8.8.8, 1.1.1.1]
    
  3. Apply and restart the VPN connection:
    sudo netplan apply
    sudo systemctl restart tailscale-gateway-init
    
Tip
Internal DNS names

To reference your APIs by their internal DNS names (rather than by IP): with DHCP, the resolvers handed out by your DHCP server apply; with a static IP, set your internal resolvers in nameservers instead of public ones. Any name the VM can resolve can be used in data sources.

Verification

  • The console banner shows the LAN IP address and the Tailscale IP address after boot
  • When connecting over SSH, the welcome message shows the VPN connection status
Note

Until the firewalls from Phase 3 are configured, the VPN status stays disconnected: this is expected. The connection establishes on its own once the flows are open.


Phase 3: Configure the Firewalls (15-30 minutes)

Caution

All rules are OUTBOUND — no inbound ports required. Only the VM initiates connections: your internal network cannot connect to it.

Throughout this page, 192.0.2.10 stands for your OutPost's IP (noted in Phase 2): it is an example to replace. Enter it here to adapt the tables and commands automatically:

Enter it to replace the 192.0.2.10 example in every command on this page — they become copy-paste ready.

Edge firewall (DMZ -> Internet)

Only one source to declare: the VM's IP (e.g. 192.0.2.10).

Strict version — every host named, with its port and protocol. It assumes no wildcard support, so it goes through as-is on every firewall, Palo Alto and Cisco ASA included.

#DestinationPortProtoWhat it's forLevel
1controlplane.tailscale.com443TCPRegistration, configuration, keysRequired
2login.tailscale.com443TCPAuthenticationRequired
3log.tailscale.com, console.tailscale.com443TCPConnection telemetry and coordinationRequired
4derpN-all.tailscale.com — one entry per region443TCPEncrypted relay: fallback data pathRequired
5derpN-all.tailscale.com — one entry per region3478UDPSTUN — NAT detectionRecommended
651.15.222.15632768-60999UDPDirect WireGuard tunnel to OverViewRecommended

All other outbound traffic: DENY.

Caution
derpN-all is not a single host

There is one per DERP region — derp1-all.tailscale.com, derp2-all.tailscale.com, … around thirty today. Each entry groups every server in its region: they exist specifically for firewall allowlists and save you from tracking individual servers.

The number of regions changes over time: build the list from the live source published at login.tailscale.com/derpmap/default rather than from a frozen count.

DERP relay list28 regions — August 2026

The 28 entries to declare, each on TCP 443 and UDP 3478:

28 lines
derp1-all.tailscale.com
derp2-all.tailscale.com
derp3-all.tailscale.com
derp4-all.tailscale.com
derp5-all.tailscale.com
derp6-all.tailscale.com
derp7-all.tailscale.com
derp8-all.tailscale.com
derp9-all.tailscale.com
derp10-all.tailscale.com
derp11-all.tailscale.com
derp12-all.tailscale.com
derp13-all.tailscale.com
derp14-all.tailscale.com
derp15-all.tailscale.com
derp16-all.tailscale.com
derp17-all.tailscale.com
derp18-all.tailscale.com
derp19-all.tailscale.com
derp20-all.tailscale.com
derp21-all.tailscale.com
derp22-all.tailscale.com
derp23-all.tailscale.com
derp24-all.tailscale.com
derp25-all.tailscale.com
derp26-all.tailscale.com
derp27-all.tailscale.com
derp28-all.tailscale.com

Declare each on TCP 443 and UDP 3478.

This list is a snapshot. Tailscale adds and removes regions; the source is authoritative. To regenerate it:

curl -s https://login.tailscale.com/derpmap/default |
  python3 -c "import json,sys; [print('derp%s-all.tailscale.com' % k) for k in sorted(json.load(sys.stdin)['Regions'], key=int)]"

The regions span several continents: that is expected — the VM measures latency to every relay to pick the closest one. See the FAQ on this.

Caution
Declare every region, not just yours

It is tempting to keep only the nearest relay — derp18-all for Paris, say. Do not: the VM probes every region to elect the fastest, and moves to another one on an incident or a network path change. An allowlist narrowed to one region works on install day, then breaks silently the day that region becomes unreachable.

If thirty entries are too much to maintain, the answer is not to remove some: it is the simplified version (*.tailscale.com, one entry) or a vendor application object.

Note

Flows 1 to 4 are the bare minimum: the first three register the VM with the control plane, the fourth gives it a data path. Without flows 5 and 6, everything goes through DERP relays over TCP 443 — functional, but slower. Flows 5 and 6 enable a direct connection between the OutPost and OverView.

Simplified versionif your firewall handles wildcards

Three rules instead of six, and a single entry to maintain instead of thirty — provided your firewall accepts a wildcard FQDN object. FortiGate, Check Point and most UTMs do; Palo Alto and Cisco ASA do not.

#DestinationPortProtoWhat it's forLevel
1*.tailscale.com443TCPControl plane and encrypted relays (DERP)Required
2*.tailscale.com3478UDPSTUN — NAT detectionRecommended
351.15.222.15632768-60999UDPDirect WireGuard tunnel to OverViewRecommended

All other outbound traffic: DENY.

The scope is unchanged — everything stays restricted to the tailscale.com domain — but the firewall tracks the DERP servers itself instead of making you keep the list current.

Tip

Some firewalls do better still: a vendor-maintained application object (Fortinet's Tailscale-Tailscale Internet Service, Palo Alto's tailscale App-ID) is as strict as the full enumeration, with no upkeep at all. See the procedure for your firewall.

Service flows

The "all other outbound traffic: DENY" of both versions above also blocks the VM's own service flows. Whichever version you pick:

  • DNS — the VM must be able to reach its resolvers (Phase 2) over UDP/TCP 53. Most networks already have a global rule for this; just check that the VM benefits from it.
  • Updates and time — the VM applies its security updates straight from the Internet and syncs its clock over NTP:
DestinationPortProtoWhat it's for
archive.ubuntu.com, security.ubuntu.com80, 443TCPOS security updates
pkgs.tailscale.com443TCPVPN client updates
ntp.ubuntu.com123UDPTime synchronisation — a wrong clock makes TLS handshakes fail
Note

Without these flows the tunnel keeps working, but automatic security updates stop applying — silently.

The Network Flows section restates these same flows as a reference to hand to your network team.

Internal firewall (DMZ -> Internal network)

SourceDestinationPortAction
VM IPTarget API IP (e.g. 10.0.1.50)8443/tcpALLOW
VM IP10.0.0.0/8 — everything elseanyDENY

Add one "ALLOW" line per API to expose. If you use internal DNS names, also allow the VM to reach your resolvers (UDP/TCP 53).

Caution
Stateful firewall required

Your edge firewall must be stateful so that return traffic on established connections (TCP and UDP) is automatically allowed. If the firewall is stateless or performs aggressive DPI (deep packet inspection), responses from DERP relays or WireGuard peers may be blocked even though the outbound connection is allowed.

Procedure for your firewall

These procedures follow Tailscale's own per-vendor guidance and each vendor's official documentation.

Note
Adapt the example values

Throughout the procedures below, 192.0.2.10 is an example: replace it everywhere with your OutPost's actual IP address, including in the diagnostic commands — or let the Your OutPost's IP field at the top of Phase 3 do that replacement for you. The 51.15.222.156 IP (OverView egress) and the *.tailscale.com names, however, must be used as-is.

Fortinet FortiGate (FortiOS)

FortiOS ships an Internet Service (ISDB) object Tailscale-Tailscale, maintained by FortiGuard: it already contains the IP ranges and ports of Tailscale's infrastructure. This is the simplest and most robust route — no FQDN and no DERP server to track.

Web UI

  1. Policy & Objects > Firewall Policy > Create New
  2. Source: the VM's address object · Destination: switch to the Internet Service tab and search for Tailscale
  3. Pick Tailscale-Tailscale, action ACCEPT, and disable deep SSL inspection

CLI (FortiOS 7.x)

config firewall address
    edit "OverView-OutPost"
        set subnet 192.0.2.10 255.255.255.255
    next
    edit "OverView-Egress"
        set subnet 51.15.222.156 255.255.255.255
    next
end

config firewall service custom
    edit "WireGuard-OverView"
        set udp-portrange 32768-60999
    next
end

config firewall policy
    edit 0
        set name "OutPost-Tailscale"
        set srcintf "dmz"
        set dstintf "wan1"
        set srcaddr "OverView-OutPost"
        set internet-service enable
        set internet-service-name "Tailscale-Tailscale"
        set action accept
        set schedule "always"
        set ssl-ssh-profile "no-inspection"
        set nat enable
    next
    edit 0
        set name "OutPost-WireGuard"
        set srcintf "dmz"
        set dstintf "wan1"
        set srcaddr "OverView-OutPost"
        set dstaddr "OverView-Egress"
        set service "WireGuard-OverView"
        set action accept
        set schedule "always"
        set nat enable
    next
end
Note

set internet-service replaces both dstaddr and service in the same rule: that is why the direct WireGuard flow to 51.15.222.156 needs a second rule.

Without ISDB — FortiOS also accepts wildcard FQDN objects in a policy's dstaddr field:

config firewall address
    edit "Tailscale-Wildcard"
        set type wildcard-fqdn
        set wildcard-fqdn "*.tailscale.com"
    next
end

Default settings that break Tailscale

This is the most common cause on FortiGate: the rule is correct, but a profile enabled by default cuts the flow.

ItemEffectFix
Deep-inspection SSL profile on the policyCertificate verification error, Tailscale enrolment failsSecurity Profiles > SSL/SSH Inspection → switch the policy to no-inspection
Application Control profile blocking the Proxy category, or the Tailscale signature (ID 51457)The VPN is cut even though the policy is set to acceptSecurity Profiles > Application Control → remove the block, or exclude the VM from the profile
ISDB database in mini mode (default on entry-level models)The Tailscale-Tailscale object is empty or incomplete: the policy never matchesconfig system global then set internet-service-database standard (or full)
ISDB at 0 entries after a FortiOS upgradeSame — the database is discarded and must be re-downloadedForce the update in System > FortiGuard
Another ISDB object overlaps the same IP/portFortiOS keeps a single object per tuple: traffic lands on a different policyCheck with diagnose internet-service match (below)

Quick diagnostics

# Is the ISDB loaded? (size, version, number of entries)
diagnose internet-service id-summary

# Which ISDB object does a Tailscale IP actually belong to?
diagnose internet-service match root <TAILSCALE_IP> 255.255.255.255

# Which service matches a given protocol / port / IP tuple?
diagnose internet-service info root 6 443 <TAILSCALE_IP>

# Trace how the flow travels through the policies
diagnose debug flow filter saddr 192.0.2.10
diagnose debug flow show function-name enable
diagnose debug flow trace start 20
diagnose debug enable
# … then to stop:
diagnose debug disable
diagnose debug reset

# What does the FortiGate actually see going through?
diagnose sniffer packet any 'host 51.15.222.156' 4

If diagnose internet-service match does not return Tailscale-Tailscale for an IP of derp1-all.tailscale.com, the ISDB is too small or out of date: fix internet-service-database before touching the rules.

WireGuard port — Fortinet recommends randomising the WireGuard client port. That setting lives on the tailnet side: contact OverSOC support if direct connections never establish.

Palo Alto Networks (PAN-OS)

Two ways to designate the destination. The App-ID is preferable: PAN-OS does not accept a wildcard inside an FQDN object (*.tailscale.com is rejected), and an FQDN object only stores 32 addresses while controlplane.tailscale.com already publishes 16 IPv4 and 16 IPv6 records.

Option A — App-ID rule (recommended)

Web interface

  1. Objects > Addresses > Add — create two address objects, each with a Description so the next administrator knows what they are:
    • OVS-OUTPOST, your OutPost's IP as a /32, e.g. 192.0.2.10/32 — OverView OutPost VM in the DMZ, source of all OverView traffic
    • OVS-OVERVIEW, 51.15.222.156/32, used as-is — OverView platform egress IP, peer of the direct WireGuard tunnel
  2. Objects > Services > Add — create the service the second rule will use:
    • Name: SVC-WIREGUARD
    • Description: UDP port range used by the direct WireGuard tunnel between the OutPost and OverView
    • Protocol: UDP
    • Destination Port: 32768-60999
    • Source Port: leave empty. The OutPost picks its source port itself, so restricting it here would drop the tunnel
    • Session Timeout: Inherit from application
  3. Policies > Security > Add — tab by tab:
    • General: Name ALLOW-TAILSCALE, and a Description such as OverView OutPost: Tailscale control plane and encrypted relays. Remove with the OutPost VM.
    • Source: Source Zone is the zone the OutPost sits in, picked from your own zones, so it is rarely called dmz: it carries whatever name that segment has on your firewall. Source Address is the OVS-OUTPOST object created above. Leave Source User and Source Device on any, and Negate unchecked
    • Destination: zone untrust (your WAN zone), address Any
    • Application: add tailscale, tailscale-base, stun and ssl. PAN-OS lists what an application needs in the Depends On panel beside the list, and warns at commit when a rule is missing one: add whatever it shows there. Content releases currently pair tailscale with tailscale-base
    • Service/URL Category: application-default
    • Actions: Allow
  4. Add a second rule for the direct tunnel, through the same tabs:
    • General: Name ALLOW-WIREGUARD, Description OverView OutPost: direct WireGuard tunnel to the OverView platform. Without it the traffic falls back to the relays.
    • Source: the same zone as the rule above, address OVS-OUTPOST
    • Destination: zone untrust, address OVS-OVERVIEW
    • Application: any
    • Service/URL Category: SVC-WIREGUARD
    • Actions: Allow
  5. Move both rules above the rule blocking VPN / proxy categories (Move > Move Up, or drag them up the list)
  6. Commit
Caution
Why the four applications

The first packets of a session are classified as ssl before the tailscale App-ID is resolved. A rule allowing only tailscale therefore cuts the session before it is identified, and the symptom is indistinguishable from an outright block.

stun covers NAT detection (UDP 3478 to the DERP relays): without it, a direct connection never establishes and all traffic goes through the relays. tailscale-base is a dependency rather than a flow of its own; Palo Alto documents how to read and resolve those in Resolve Application Dependencies.

The wireguard App-ID is not in this rule. The direct tunnel is matched by the second rule, on the SVC-WIREGUARD service. Add wireguard here only if you prefer to collapse both flows into a single rule, and give that rule the service too: with application-default, wireguard carries port 51820, which does not cover the range OverView uses.

Equivalent CLI

set address OVS-OUTPOST  ip-netmask 192.0.2.10/32 description "OverView OutPost VM in the DMZ"
set address OVS-OVERVIEW ip-netmask 51.15.222.156/32 description "OverView platform egress IP"
set service SVC-WIREGUARD protocol udp port 32768-60999 description "Direct WireGuard tunnel, OutPost to OverView"

set rulebase security rules ALLOW-TAILSCALE from dmz to untrust \
    source OVS-OUTPOST destination any \
    application [ tailscale tailscale-base stun ssl ] \
    service application-default action allow \
    description "OverView OutPost: Tailscale control plane and encrypted relays"

set rulebase security rules ALLOW-WIREGUARD from dmz to untrust \
    source OVS-OUTPOST destination OVS-OVERVIEW \
    application any service SVC-WIREGUARD action allow \
    description "OverView OutPost: direct WireGuard tunnel to OverView"

move rulebase security rules ALLOW-TAILSCALE top

Option B — if the tailscale App-ID is missing from your content release

Since an FQDN object cannot carry a wildcard, two object types have to be combined:

  1. Objects > Addresses — one FQDN object per name: controlplane.tailscale.com, login.tailscale.com, log.tailscale.com, then one derpN-all.tailscale.com object per DERP region (live list). Group them under Objects > Address Groups.
  2. Objects > Custom Objects > URL Category > Add — a TAILSCALE category containing *.tailscale.com/
  3. In the rule: the address group as Destination, the custom category in the Service/URL Category tab
Caution
FQDN resolution limit

An FQDN object only keeps 32 addresses, refreshed every 30 minutes. controlplane.tailscale.com publishes 16 IPv4 and 16 IPv6 records: the limit is reached immediately, and the slightest rotation moves traffic outside the rule's scope. Without an App-ID, prefer an Any destination restricted to TCP/443 — the source is already limited to this single VM.

Things to watch

  • NAT — Policies > NAT, on the rule applying to the VM, Translated Packet tab: translation type Persistent Dynamic IP and Port (PAN-OS 11.1.1 and later). On an older PAN-OS, create a dedicated Static IP NAT rule for the VM — with regular dynamic translation the source port is unpredictable and everything falls back to DERP relays.
  • Decryption — Policies > Decryption: add a No Decrypt rule for OVS-OUTPOST. tailscaled rejects a re-signed certificate and enrolment fails.
  • Security Profiles — the next trap once the rule is in place: traffic shows as allow in Monitor > Traffic yet the session is still cut. Check Monitor > Threat: a Vulnerability Protection or Anti-Spyware profile attached to the rule can reset it. Remove the profile for this rule.
  • Signature of the block — an immediate RST after the ClientHello points to a reset-both action on a rule placed higher up, not to a closed port 443.

Quick diagnostics

# Does the rule actually match?
test security-policy-match from dmz to untrust source 192.0.2.10 \
    destination <TAILSCALE_IP> destination-port 443 protocol 6

# Are the FQDN objects resolved? (mapping, remaining TTL, last refresh)
request system fqdn show

# Force a refresh (whole table — there is no per-entry refresh)
request system fqdn refresh

In Monitor > Traffic, the filter (addr.src eq 192.0.2.10) and (app eq tailscale) isolates the OutPost's traffic and names the responsible rule in the Rule column.

SymptomLikely cause
Traffic logged allow in Monitor > Traffic, session still resetA Security Profile is cutting the session — check Monitor > Threat
Immediate RST after the Client helloA reset-both rule sits higher up: the Allow rule is not the first to match
Application seen as incomplete / insufficient-dataThe session never completes — check NAT translation and outbound reachability
request system fqdn show returns nothing for an objectThe object is not referenced by any rule, or the DNS in Device > Setup > Services is not answering
Direct connection never established, everything relays via DERPNon-persistent NAT translation (switch to Persistent Dynamic IP and Port), or the stun application missing from the rule
Check Point (R80.10+)

Per Tailscale, Check Point establishes direct connections with no special configuration. All that is left is the outbound rule.

Objects

ObjectTypeValue
OverView-OutPostHost192.0.2.10
OverView-EgressHost51.15.222.156
.tailscale.comDomain — FQDN unchecked.tailscale.com
UDP-STUNUDP service3478
UDP-WireGuardUDP service32768-60999

The leading dot is required. FQDN unchecked means non-FQDN mode, which matches the domain and its sub-domains (controlplane., derp1-all.…). Checked, the object would only match tailscale.com and www.tailscale.com.

Rules

#SourceDestinationServiceAction
1OverView-OutPost.tailscale.comhttps, UDP-STUNAccept
2OverView-OutPostOverView-EgressUDP-WireGuardAccept

Things to watch

  • Non-FQDN mode relies on reverse DNS lookups: if matching proves unreliable, replace the Domain object with individually named Domain FQDN objects.
  • Exclude the OverView-OutPost source from HTTPS Inspection — TLS interception breaks Tailscale enrolment.

Quick diagnostics

# Dropped packets in real time, with the drop reason (Ctrl+C to stop)
fw ctl zdebug + drop | grep 192.0.2.10

# Kernel tables of the reverse-DNS resolver used by Domain objects
fw ctl multik print_bl dns_reverse_cache_tbl

# Restart the resolver if Domain objects stop matching,
# then reinstall the policy
killall wsdnsd
SymptomLikely cause
Drop log on the "Cleanup rule" although the rule existsThe non-FQDN Domain object did not resolve: the gateway reasons in IPs, not names
Intermittent matchingNon-FQDN mode depends on reverse lookups that do not always succeed — switch to Domain FQDN objects
Domain resolving error in the logsDNS unreachable from the gateway — check Gateway Properties > DNS

Logs live in SmartConsole, Logs & Monitor tab, filtered on the OverView-OutPost source.

Cisco ASA / Firepower (FTD)

ASA — network objects of type fqdn do not accept wildcards, and DNS resolution must work on the appliance itself.

dns domain-lookup outside
dns server-group DefaultDNS
 name-server 8.8.8.8

! 192.0.2.10 = your OutPost's IP — replace it with yours
object network OVS-OUTPOST
 host 192.0.2.10
object network OVS-OVERVIEW
 host 51.15.222.156

object network TS-CONTROLPLANE
 fqdn controlplane.tailscale.com
object network TS-LOGIN
 fqdn login.tailscale.com
object network TS-DERP1
 fqdn derp1-all.tailscale.com
! … one object per DERP region published in the derp map

object-group network TS-ALL
 network-object object TS-CONTROLPLANE
 network-object object TS-LOGIN
 network-object object TS-DERP1

access-list DMZ_OUT extended permit tcp object OVS-OUTPOST object-group TS-ALL eq 443
access-list DMZ_OUT extended permit udp object OVS-OUTPOST object-group TS-ALL eq 3478
access-list DMZ_OUT extended permit udp object OVS-OUTPOST object OVS-OVERVIEW range 32768 60999
access-group DMZ_OUT in interface dmz

Firepower / FTD — URL objects do accept wildcards. Create a .tailscale.com URL object and use it in the URLs tab of an Access Control rule instead of enumerating 28 FQDN objects.

Things to watch

  • Without a dedicated NAT port opening, Cisco pushes the traffic onto DERP relays: functional, just slower.
  • Cisco Umbrella (endpoint agent): no known workaround, traffic always uses relays.
  • Do not enable SSL/TLS decryption on this flow.

Quick diagnostics

! ASA — simulate the flow through the policy
packet-tracer input dmz tcp 192.0.2.10 12345 <TAILSCALE_IP> 443 detailed

! Are the FQDN objects resolved?
show dns
show run object network

! Is the ACL actually traversed? (hit counters)
show access-list DMZ_OUT
SymptomLikely cause
show dns returns no entrydns domain-lookup is not enabled on a reachable interface: FQDN objects stay empty and the ACL never matches
packet-tracer stops in the ACCESS-LIST phase with DROPThe relevant FQDN object is missing from the object-group, or did not resolve
Hit counters at 0 on the UDP 32768-60999 lineNormal if the direct connection is never attempted — traffic goes through DERP relays

On Firepower / FTD, the equivalent logs are under Analysis > Connection Events, filtered on the VM's IP.

pfSense / OPNsense

Aliases

Create aliases of type Host(s) — pfSense/OPNsense aliases resolve FQDNs periodically, but do not accept wildcards:

AliasTypeContents
Tailscale_CPHost(s)controlplane.tailscale.com, login.tailscale.com, log.tailscale.com
Tailscale_DERPHost(s)one derpN-all.tailscale.com per DERP region
OverView_EgressHost(s)51.15.222.156

Rules (DMZ interface)

ProtoSourceDestinationPortAction
TCPVM IPTailscale_CP, Tailscale_DERP443Pass
UDPVM IPTailscale_DERP3478Pass
UDPVM IPOverView_Egress32768-60999Pass

Watch out — outbound NAT

By default NAT rewrites the source port, which prevents direct connections. Switch Firewall > NAT > Outbound to Hybrid or Manual mode, then tick Static Port on the rule covering the VM's IP. Enabling NAT-PMP or UPnP achieves the same result.

Quick diagnostics

# What does the alias actually contain after DNS resolution?
pfctl -t Tailscale_CP -T show

# States open from the VM
pfctl -ss | grep 192.0.2.10
SymptomLikely cause
pfctl -t … -T show returns an empty tableThe alias FQDNs do not resolve — check the firewall's DNS
Block on the "Default deny rule" in Status > System Logs > FirewallThe rule sits too low: on an interface, rules are evaluated top-down and the first match wins
tailscale netcheck returns UDP: false on the VMOutbound NAT without Static Port, or UDP 3478 blocked
Other vendors
VendorDefault behaviourWhat to do
SophosDirect connection worksNothing specific
BarracudaFalls back to DERP relaysRaise the Max UDP parameter (concurrent UDP sessions)
UniFi GatewayFalls back to DERP relaysDisable P2P threat detection in the security settings

In every case, a firewall that lets outbound TCP/443 through is enough for the OutPost to work.

Tip

If the rule looks correct and the VM still does not connect, head to The VM Cannot Reach Tailscale: the rule's hit counter tells you in one second whether the traffic actually goes through it.


Phase 4: Activation and Adding Data Sources

Once the VM is deployed and the firewalls are configured, let OverSOC know the VM is online. OverSOC verifies the VPN connection and validates that everything works.

Once the OutPost is connected, it automatically appears in your OverView interface when you add a data source. You configure access to the target APIs:

  1. In OverView, go to Data Sources > Add
  2. Select your OutPost as the collection point
  3. Enter the connection details for the target API
Note
IP or DNS name?

Both work. An internal DNS name (e.g. api.internal.corp) can be used as long as the VM can resolve it — meaning its DNS resolvers (see Phase 2) know your internal zones. When in doubt, an IP address always works.

Your actions:

  • Make sure internal firewall rules allow the VM to reach your APIs
  • Add your data sources in OverView

VM Access

MethodDetails
Console (hypervisor)Login: ubuntu, password provided by OverSOC
SSHssh ubuntu@<LAN_IP> (SSH key provided by OverSOC if applicable)

Security recommendation: once the VM is connected to the network, configure an SSH key and disable the password:

# Add your SSH key
echo "ssh-ed25519 AAAA... your@email" >> ~/.ssh/authorized_keys

# Disable the password
sudo passwd -d ubuntu

Useful commands:

  • tailscale status — Check the VPN connection status
  • sudo gateway-reconfig — Reconfiguration menu (change the VPN key, reconnect)

Network Flows

Required outbound flows (source: VM IP):

ServiceDestinationPortProtocolRequired for
Control planecontrolplane.tailscale.com443TCP (HTTPS)Registration, auth, config
Loginlogin.tailscale.com443TCP (HTTPS)Authentication
Logs & consolelog.tailscale.com, console.tailscale.com443TCP (HTTPS)Connection telemetry and coordination
DERP relaysderpN-all.tailscale.com443TCPRelayed traffic (fallback if direct connection is not possible)
STUNderpN-all.tailscale.com3478UDPNAT detection (required for direct connections)
WireGuard direct51.15.222.15632768-60999UDPDirect peer-to-peer connection (best perf)

Service flows (non-VPN — see Service flows):

ServiceDestinationPortProtocolRequired for
OS updatesarchive.ubuntu.com, security.ubuntu.com80, 443TCPAutomatic security updates
VPN updatespkgs.tailscale.com443TCPTailscale client updates
NTPntp.ubuntu.com123UDPTime synchronisation

The VM must also be able to reach its DNS resolvers (UDP/TCP 53) — usually covered by an existing rule.

Note

Minimum requirement: outbound TCP 443 to *.tailscale.com. If UDP is blocked, Tailscale falls back to DERP relays (TCP 443) — slower but functional. Opening UDP to 51.15.222.156 allows a direct connection between the OutPost and OverView, bypassing relay servers entirely.


Troubleshooting

1. Start Here — Quick Diagnostic

Always start with this command — it gives the most information in a single shot:

tailscale netcheck

Tests everything at once: DERP reachability, UDP, STUN, hairpinning.

Expected healthy result:

FieldExpected value
UDPtrue
IPv4detected address
Nearest DERPa server (e.g. par for Paris)

If everything is false / unknown → upstream network issue. See section 2 below.

Status and logs:

sudo tailscale status
sudo journalctl -u tailscaled -n 100 --no-pager

2. The VM Cannot Reach Tailscale

Typical symptoms: tailscale status shows Logged out, or the logs show fetch control key: ... context deadline exceeded. Run these checks in order — each one isolates a layer.

Caution
A successful ping proves nothing

ping controlplane.tailscale.com and curl https://google.com succeed on almost every network that breaks this VM: most firewalls let ICMP and general web browsing through while blocking Tailscale by name. Do not conclude "the flow is open" from those two tests.

DNS

dig controlplane.tailscale.com

If resolution fails, check /etc/resolv.conf and that your firewall is not blocking UDP 53.

HTTPS to the Control Plane (port 443)

curl -v https://controlplane.tailscale.com/key?v=142

Tailscale registration goes entirely over HTTPS. Where exactly the output stops tells you what is blocking:

What you seeMeaning
HTTP/2 200 at the endThe control plane is reachable — the problem is elsewhere (see section 3)
Nothing after Trying <ip>:443...TCP is dropped — outbound 443 closed on the firewall
Connected to ... then a hang right after Client helloTCP goes through, TLS is cut after the server name is read — see below
Certificate error (self signed, internal CA)A proxy is intercepting TLS — see below

TLS Does Not Complete: Interception, SNI, or Application Category

Three possible TLS blocks, and two commands tell them apart:

# Test A — handshake with the real name
timeout 10 openssl s_client -connect controlplane.tailscale.com:443 \
  -servername controlplane.tailscale.com </dev/null 2>&1 | tail -5

# Test B — same IP, harmless name
IP=$(getent ahostsv4 controlplane.tailscale.com | awk 'NR==1{print $1}')
timeout 10 openssl s_client -connect $IP:443 -servername www.google.com </dev/null 2>&1 | tail -5

On a network that lets Tailscale through, both tests end with Verify return code: 0 (ok): the Tailscale load balancer completes the handshake whatever server name it receives.

ResultCauseFix
A completes but shows a certificate issued by an internal CA (not Let's Encrypt / DigiCert)A proxy is intercepting TLSExclude *.tailscale.com from TLS inspection
A hangs after Client hello, B succeedsThe domain name is filtered (the only variable that changed is the name sent)See the two rules below
A and B both hangThe destination IP range is blockedOpen outbound TCP 443 (see Network Flows)

When the name is what's filtered, no setting on the VM works around it — two rules to check with your network team:

  1. URL / SNI filtering — allow *.tailscale.com on TCP 443 (details in Network Flows).
  2. Application / category filtering — Tailscale is classified as a VPN or anonymizer by most next-generation firewalls (Fortinet, Palo Alto, Check Point, Zscaler) and blocked by category, even when the destination is allowed. That rule must be overridden for this VM's IP address only. It is the usual culprit when "we opened the flow" and "it still fails" coexist. Tailscale documents this per vendor (Fortinet, Palo Alto, Check Point, Sophos…) in Configure your firewall to work with Tailscale — for Fortinet: make sure no rule blocks the Proxy category or matches the Tailscale application defined in FortiGuard.
Tip
The rule looks right but it still blocks?

Check your firewall rule's hit counter. This VM retries the connection every ~30 seconds: a rule the traffic actually traverses racks up hundreds of hits within hours. A near-zero counter proves the traffic falls through to another rule further down the list — that one is what needs fixing. Frequent cause: FQDN destination objects, while controlplane.tailscale.com publishes 15+ rotating addresses — the firewall and the VM resolve different IPs and the rule is skipped. Prefer a vendor-maintained application object (e.g. Fortinet's "Tailscale" Internet Service), or an open destination limited to the required services, since the source is already restricted to this VM.

Evidence for the network team — the control plane also answers in clear text on port 80:

timeout 10 curl -sS -o /dev/null -w '%{http_code}\n' http://controlplane.tailscale.com/derpmap/default

If port 80 answers 200 while 443 hangs, the filtering is on HTTPS, not on the destination.

Caution
Word the request correctly

Do not ask for "TCP 443 to be opened": it already is — the TCP connection establishes. It is the domain name, read in clear text from the ClientHello, that triggers the reset. A network team looking for a rule on the port will find nothing. Ask for *.tailscale.com to be allowed on a URL / SNI / application filtering rule, for this VM's IP only.

Note
Reading trap in network traces

controlplane.tailscale.com resolves into 192.200.0.0/24 (and 2606:b740:49::/48). Despite the 192. prefix, this is public address space: only 192.168.0.0/16 is private under RFC 1918. A 192.200.x.x destination in a trace is therefore neither a routing mistake nor leaked internal addressing.

Behind an Explicit Outbound Proxy

The tailscaled service does not read your shell's proxy variables. Declare the proxy in the systemd unit:

sudo systemctl edit tailscaled
# Add:
# [Service]
# Environment="HTTPS_PROXY=http://proxy:port"

sudo systemctl restart tailscaled

The proxy must allow CONNECT to *.tailscale.com:443 without TLS inspection.

3. Invalid or Expired Key

Symptoms:

  • The logs show backend error: invalid key: API key ... not valid → the auth key is expired or revoked
  • The VM used to be connected but is now unreachable, and OverView shows the "Expired" status → the machine key has expired

Fix — identical in both cases:

  1. Contact OverSOC support — only OverSOC can generate a new auth key (the Tailscale console is managed by OverSOC). The machine's permissions (tags) are carried by the key: nothing to configure on that side.
  2. Once you receive the new key, apply it on the VM:
sudo tailscale up --auth-key=tskey-auth-NEW_KEY

(Add --force-reauth if the machine was in the "Expired" state.)

Caution
"requires mentioning all non-default flags"

If tailscale up refuses with this message, that is expected: the VM already carries a configuration, and tailscale up would reset any setting not mentioned. The error prints the exact command to use (with all current settings, e.g. tailscale up --hostname=...): copy it as-is and append --auth-key=.... Alternative: sudo gateway-reconfig handles it for you.

4. Subnet Router — Enable Routes

Symptom: OverView reports that the OutPost does not expose any network routes.

Fix:

On the VM, advertise local network routes:

sudo tailscale set --advertise-routes=172.18.0.0/16
Caution

Adjust the CIDR to the VM's actual network.

Use tailscale set, not tailscale up: set changes that one setting, whereas up resets every setting not mentioned on the command line.

Then contact OverSOC to approve the advertised routes on the Tailscale console.

5. VM Running but Unreachable

Symptom: the VM is running and tailscaled is active, but OverSOC reports the OutPost as unreachable and collections no longer complete.

This is the signature of a reachable control plane with no data path: port 443 to controlplane.tailscale.com still goes through, but no traffic flows with any other device.

Diagnosis, from the VM:

tailscale netcheck
ObservationInterpretation
No DERP latency, UDP: falseNeither relay nor direct path: 443 to derp*.tailscale.com and UDP are blocked
DERP latencies shown, UDP: trueDo not conclude the relay works — see below

netcheck latencies are measured with STUN over UDP 3478, whereas the relay itself is a TLS connection over TCP 443 to derp*.tailscale.com. Domain-name (SNI) filtering that blocks 443 to the relays leaves STUN untouched: you see latencies and UDP: true while no data flows at all.

To test the relay itself rather than STUN:

tailscale debug derp par

Expected: at least one Successfully established a DERP connection line. Entries under Errors that only concern IPv6 (no route to host) are normal on a site without IPv6. However, no established connection while netcheck reports a latency for Paris confirms the relay channel is severed.

Special case: certificate signed by unknown authority

If tailscale debug derp par returns this:

Error upgrading connection to node "derp18d.tailscale.com" @ "176.58.90.104:443"
to TLS over IPv4: tls: failed to verify certificate:
x509: certificate signed by unknown authority

the TCP connection succeeds — what fails is certificate validation. An in-path appliance (application firewall, proxy) is performing TLS inspection: it decrypts the session and re-signs it with its internal authority, which the VM does not trust.

Tailscale relay certificates are issued by Let's Encrypt and can be checked from any unfiltered network:

echo | openssl s_client -connect 176.58.90.104:443 \
  -servername derp18d.tailscale.com 2>/dev/null | openssl x509 -noout -issuer
# issuer=C=US, O=Let's Encrypt, CN=YE1

Tailscale validates the certificate chain strictly. TLS inspection is therefore structurally incompatible: there is no workaround on the VM side.

Fix: exempt the Tailscale domains from TLS inspection — ssl-exempt on FortiGate, "SSL bypass" or "TLS inspection exclusion" depending on the appliance.

DomainPurpose
controlplane.tailscale.comRegistration, authentication, configuration
derp*.tailscale.comEncrypted relays
log.tailscale.comTelemetry and audit trail

In the same output, over IPv6: ... network is unreachable errors are normal on a site without IPv6: that is not the cause.

Fix: run the checks from section 2 against the DERP destinations, then validate:

tailscale netcheck                          # expected: Nearest DERP set, UDP: true
tailscale debug derp par                    # expected: at least one DERP connection established
tailscale ping tailscale-tenant-operator    # the OverView peer, listed in tailscale status

FAQ

Q: Who can access the VM? A: Only OverView. The OutPost is part of OverView's private Tailscale network, isolated from the Internet and any other access.

Q: Can the VM access our internal network? A: Only what you explicitly allow through your firewall rules. By default: zero access.

Q: What happens if the VM is compromised? A: The blast radius is limited to the APIs explicitly allowed by your firewall rules. The VM cannot pivot to other resources.

Q: What is the performance impact? A: WireGuard overhead is < 5%. Peer-to-peer mode performs like a direct connection.

Q: What if the VPN connection drops? A: Connect to the VM and run sudo gateway-reconfig to reconnect. If the problem persists, contact OverSOC support.

Q: How do we revoke access? A: Contact OverSOC support. Revocation is instant (propagation < 30 seconds).

Q: Why does Tailscale connect to servers in many different countries? A: This is normal and expected behavior. Tailscale periodically measures latency to its worldwide DERP relay servers to pick the closest one — that is what tailscale netcheck does. No application data is sent during these probes; only the closest relay (e.g. par for Paris) serves as fallback when a direct connection is not possible.