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.
Security model:
| Principle | In practice |
|---|---|
| Private network isolation | The 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 default | The VM starts with zero access to your internal network. Every API requires an explicit firewall rule — no lateral movement possible |
| Encryption | WireGuard (ChaCha20-Poly1305), end-to-end between OverView and your OutPost, automatic key rotation |
| Data flow | Direct 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
- Open the vSphere Client (web interface)
- Right-click the host or cluster > Deploy OVF Template...
- Select Local file and choose the provided
.ovafile - Follow the wizard: name the VM, pick the datastore, select the network (VLAN/portgroup)
- Click Finish and wait for the import to complete
- Start the VM
Microsoft Hyper-V.vhdx file
- Copy the provided
.vhdxfile onto the Hyper-V host - 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) - 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 - Configure resources (2 vCPU, 2 GB RAM), connect a virtual switch, start the VM
Generation 1? Tell us before the build: a
.vhdis provided instead (same procedure, no Secure Boot setting needed).
Nutanix AHV.qcow2 file
- Open Prism Central > Compute & Storage > Images > Add Image
- Upload the provided
.qcow2file, type Disk, place it on the target cluster - Go to Compute & Storage > VMs > Create VM
- Configure: 2 vCPU, 2 GB RAM, and set the Boot Configuration to UEFI (the image is built for UEFI boot)
- Attach a disk: Clone from Image > select the uploaded image
- Add a NIC on the desired subnet/VLAN
- Save and start the VM
Proxmox VE / KVM.qcow2 file
Proxmox VE
- Copy the provided
.qcow2file onto the Proxmox host - 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)
- Import the image:
qm importdisk <vmid> ovsgw-*.qcow2 <storage> - Attach the imported disk, set it as the boot device
- 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
- Open the hypervisor console and log in with the
ubuntulogin and the password provided by OverSOC - 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] - Apply and restart the VPN connection:
sudo netplan apply sudo systemctl restart tailscale-gateway-init
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
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)
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.
| # | Destination | Port | Proto | What it's for | Level |
|---|---|---|---|---|---|
| 1 | controlplane.tailscale.com | 443 | TCP | Registration, configuration, keys | Required |
| 2 | login.tailscale.com | 443 | TCP | Authentication | Required |
| 3 | log.tailscale.com, console.tailscale.com | 443 | TCP | Connection telemetry and coordination | Required |
| 4 | derpN-all.tailscale.com — one entry per region | 443 | TCP | Encrypted relay: fallback data path | Required |
| 5 | derpN-all.tailscale.com — one entry per region | 3478 | UDP | STUN — NAT detection | Recommended |
| 6 | 51.15.222.156 | 32768-60999 | UDP | Direct WireGuard tunnel to OverView | Recommended |
All other outbound traffic: DENY.
derpN-all is not a single hostThere 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:
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.comDeclare 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.
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.
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.
| # | Destination | Port | Proto | What it's for | Level |
|---|---|---|---|---|---|
| 1 | *.tailscale.com | 443 | TCP | Control plane and encrypted relays (DERP) | Required |
| 2 | *.tailscale.com | 3478 | UDP | STUN — NAT detection | Recommended |
| 3 | 51.15.222.156 | 32768-60999 | UDP | Direct WireGuard tunnel to OverView | Recommended |
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.
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:
| Destination | Port | Proto | What it's for |
|---|---|---|---|
archive.ubuntu.com, security.ubuntu.com | 80, 443 | TCP | OS security updates |
pkgs.tailscale.com | 443 | TCP | VPN client updates |
ntp.ubuntu.com | 123 | UDP | Time synchronisation — a wrong clock makes TLS handshakes fail |
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)
| Source | Destination | Port | Action |
|---|---|---|---|
| VM IP | Target API IP (e.g. 10.0.1.50) | 8443/tcp | ALLOW |
| VM IP | 10.0.0.0/8 — everything else | any | DENY |
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).
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.
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
- Policy & Objects > Firewall Policy > Create New
- Source: the VM's address object · Destination: switch to the Internet Service tab and search for
Tailscale - 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
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.
| Item | Effect | Fix |
|---|---|---|
| Deep-inspection SSL profile on the policy | Certificate verification error, Tailscale enrolment fails | Security 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 accept | Security 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 matches | config system global then set internet-service-database standard (or full) |
| ISDB at 0 entries after a FortiOS upgrade | Same — the database is discarded and must be re-downloaded | Force the update in System > FortiGuard |
| Another ISDB object overlaps the same IP/port | FortiOS keeps a single object per tuple: traffic lands on a different policy | Check 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
- 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 trafficOVS-OVERVIEW,51.15.222.156/32, used as-is — OverView platform egress IP, peer of the direct WireGuard tunnel
- 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
- Name:
- 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 theOVS-OUTPOSTobject created above. Leave Source User and Source Device onany, and Negate unchecked - Destination: zone
untrust(your WAN zone), addressAny - Application: add
tailscale,tailscale-base,stunandssl. 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 pairtailscalewithtailscale-base - Service/URL Category:
application-default - Actions:
Allow
- General: Name
- 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, addressOVS-OVERVIEW - Application:
any - Service/URL Category:
SVC-WIREGUARD - Actions:
Allow
- General: Name
- Move both rules above the rule blocking VPN / proxy categories (Move > Move Up, or drag them up the list)
- Commit
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:
- Objects > Addresses — one FQDN object per name:
controlplane.tailscale.com,login.tailscale.com,log.tailscale.com, then onederpN-all.tailscale.comobject per DERP region (live list). Group them under Objects > Address Groups. - Objects > Custom Objects > URL Category > Add — a
TAILSCALEcategory containing*.tailscale.com/ - In the rule: the address group as Destination, the custom category in the Service/URL Category tab
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.tailscaledrejects a re-signed certificate and enrolment fails. - Security Profiles — the next trap once the rule is in place: traffic shows as
allowin 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.
| Symptom | Likely cause |
|---|---|
Traffic logged allow in Monitor > Traffic, session still reset | A Security Profile is cutting the session — check Monitor > Threat |
Immediate RST after the Client hello | A reset-both rule sits higher up: the Allow rule is not the first to match |
Application seen as incomplete / insufficient-data | The session never completes — check NAT translation and outbound reachability |
request system fqdn show returns nothing for an object | The object is not referenced by any rule, or the DNS in Device > Setup > Services is not answering |
| Direct connection never established, everything relays via DERP | Non-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
| Object | Type | Value |
|---|---|---|
OverView-OutPost | Host | 192.0.2.10 |
OverView-Egress | Host | 51.15.222.156 |
.tailscale.com | Domain — FQDN unchecked | .tailscale.com |
UDP-STUN | UDP service | 3478 |
UDP-WireGuard | UDP service | 32768-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
| # | Source | Destination | Service | Action |
|---|---|---|---|---|
| 1 | OverView-OutPost | .tailscale.com | https, UDP-STUN | Accept |
| 2 | OverView-OutPost | OverView-Egress | UDP-WireGuard | Accept |
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-OutPostsource 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
| Symptom | Likely cause |
|---|---|
| Drop log on the "Cleanup rule" although the rule exists | The non-FQDN Domain object did not resolve: the gateway reasons in IPs, not names |
| Intermittent matching | Non-FQDN mode depends on reverse lookups that do not always succeed — switch to Domain FQDN objects |
Domain resolving error in the logs | DNS 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
| Symptom | Likely cause |
|---|---|
show dns returns no entry | dns 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 DROP | The relevant FQDN object is missing from the object-group, or did not resolve |
| Hit counters at 0 on the UDP 32768-60999 line | Normal 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:
| Alias | Type | Contents |
|---|---|---|
Tailscale_CP | Host(s) | controlplane.tailscale.com, login.tailscale.com, log.tailscale.com |
Tailscale_DERP | Host(s) | one derpN-all.tailscale.com per DERP region |
OverView_Egress | Host(s) | 51.15.222.156 |
Rules (DMZ interface)
| Proto | Source | Destination | Port | Action |
|---|---|---|---|---|
| TCP | VM IP | Tailscale_CP, Tailscale_DERP | 443 | Pass |
| UDP | VM IP | Tailscale_DERP | 3478 | Pass |
| UDP | VM IP | OverView_Egress | 32768-60999 | Pass |
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
| Symptom | Likely cause |
|---|---|
pfctl -t … -T show returns an empty table | The alias FQDNs do not resolve — check the firewall's DNS |
| Block on the "Default deny rule" in Status > System Logs > Firewall | The rule sits too low: on an interface, rules are evaluated top-down and the first match wins |
tailscale netcheck returns UDP: false on the VM | Outbound NAT without Static Port, or UDP 3478 blocked |
Other vendors
| Vendor | Default behaviour | What to do |
|---|---|---|
| Sophos | Direct connection works | Nothing specific |
| Barracuda | Falls back to DERP relays | Raise the Max UDP parameter (concurrent UDP sessions) |
| UniFi Gateway | Falls back to DERP relays | Disable 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.
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:
- In OverView, go to Data Sources > Add
- Select your OutPost as the collection point
- Enter the connection details for the target API
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
| Method | Details |
|---|---|
| Console (hypervisor) | Login: ubuntu, password provided by OverSOC |
| SSH | ssh 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 statussudo gateway-reconfig— Reconfiguration menu (change the VPN key, reconnect)
Network Flows
Reference: Tailscale Firewall Ports
Required outbound flows (source: VM IP):
| Service | Destination | Port | Protocol | Required for |
|---|---|---|---|---|
| Control plane | controlplane.tailscale.com | 443 | TCP (HTTPS) | Registration, auth, config |
| Login | login.tailscale.com | 443 | TCP (HTTPS) | Authentication |
| Logs & console | log.tailscale.com, console.tailscale.com | 443 | TCP (HTTPS) | Connection telemetry and coordination |
| DERP relays | derpN-all.tailscale.com | 443 | TCP | Relayed traffic (fallback if direct connection is not possible) |
| STUN | derpN-all.tailscale.com | 3478 | UDP | NAT detection (required for direct connections) |
| WireGuard direct | 51.15.222.156 | 32768-60999 | UDP | Direct peer-to-peer connection (best perf) |
Service flows (non-VPN — see Service flows):
| Service | Destination | Port | Protocol | Required for |
|---|---|---|---|---|
| OS updates | archive.ubuntu.com, security.ubuntu.com | 80, 443 | TCP | Automatic security updates |
| VPN updates | pkgs.tailscale.com | 443 | TCP | Tailscale client updates |
| NTP | ntp.ubuntu.com | 123 | UDP | Time synchronisation |
The VM must also be able to reach its DNS resolvers (UDP/TCP 53) — usually covered by an existing rule.
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:
| Field | Expected value |
|---|---|
| UDP | true |
| IPv4 | detected address |
| Nearest DERP | a 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.
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 see | Meaning |
|---|---|
HTTP/2 200 at the end | The 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 hello | TCP 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.
| Result | Cause | Fix |
|---|---|---|
| A completes but shows a certificate issued by an internal CA (not Let's Encrypt / DigiCert) | A proxy is intercepting TLS | Exclude *.tailscale.com from TLS inspection |
A hangs after Client hello, B succeeds | The domain name is filtered (the only variable that changed is the name sent) | See the two rules below |
| A and B both hang | The destination IP range is blocked | Open 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:
- URL / SNI filtering — allow
*.tailscale.comon TCP 443 (details in Network Flows). - 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.
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.
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.
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:
- 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.
- 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.)
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
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
| Observation | Interpretation |
|---|---|
No DERP latency, UDP: false | Neither relay nor direct path: 443 to derp*.tailscale.com and UDP are blocked |
DERP latencies shown, UDP: true | Do 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.
| Domain | Purpose |
|---|---|
controlplane.tailscale.com | Registration, authentication, configuration |
derp*.tailscale.com | Encrypted relays |
log.tailscale.com | Telemetry 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.