Verify a deployment
Do not confirm a remote change merely because the client connected. Verify the control state and the data path from the affected device.
Prerequisites
Section titled “Prerequisites”- The device is connected using its newly issued profile.
- An independent SSH session remains open.
- The deploy used
--confirm-withinwhen a previous revision existed.
Check control state on the hub
Section titled “Check control state on the hub”sudo hubctl statussudo vpn-hub-agent statussudo systemctl is-active vpn-hub-agentsudo journalctl -u vpn-hub-agent --since '-5 minutes' --no-pagersudo hubctl --config /etc/vpn-hub/hub.yaml routesExpected result: hubctl and the agent name the same desired revision, the unit is active, the journal has no repeating reconcile error, and routes name the intended egresses.
Check from the device
Section titled “Check from the device”curl --fail --silent --show-error https://example.com/ >/dev/nullnslookup example.com 10.80.0.1For a provider egress, compare the observed public address with the provider’s documented exit by using an operator-chosen diagnostic endpoint. VPN Hub does not bundle a third-party “what is my IP” dependency.
Prove fail-closed behavior
Section titled “Prove fail-closed behavior”Use a dedicated non-critical device whose egress is a dedicated WireGuard tunnel named ks-wg. Do not disable that tunnel in YAML: validation rejects a disabled egress while a device references it. First prove the device has connectivity:
curl --max-time 10 --fail --silent --show-error https://example.com/ >/dev/nullIn an independent root SSH session, run a bounded transient unit. It stops the reconciler, lowers only that tunnel’s wg0, waits 45 seconds, then raises the interface and restarts the agent even on interruption. The 90-second runtime limit provides a second recovery bound.
systemd-run --unit=vpn-hub-kill-switch-test --collect --wait \ --property=RuntimeMaxSec=90 \ /bin/bash -ceu 'restore() { ip -n vpn-hub-ks-wg link set wg0 up || true systemctl start vpn-hub-agent}trap restore EXIT INT TERMsystemctl stop vpn-hub-agentip -n vpn-hub-ks-wg link set wg0 downsleep 45'During that 45-second window, run this on the dedicated device:
if curl --max-time 10 --fail --silent --show-error https://example.com/ >/dev/null; then echo 'unexpected connectivity: investigate before continuing' >&2 exit 1else echo 'blocked as expected'fiExpected result: the request fails and prints blocked as expected; it must not leave through direct. After the transient unit exits, verify recovery on the hub:
systemctl is-active vpn-hub-agentip -n vpn-hub-ks-wg link show wg0hubctl --config /etc/vpn-hub/hub.yaml test tunnel ks-wgThe agent should be active, wg0 should be UP, and the configured tunnel probe should succeed. An unconfigured probe returns unknown as an error; it is not reported healthy. If recovery fails, run ip -n vpn-hub-ks-wg link set wg0 up and systemctl start vpn-hub-agent from the independent SSH session, then inspect the journal before continuing.
Roll back or confirm
Section titled “Roll back or confirm”sudo hubctl confirmIf any check fails, do not confirm. Run sudo hubctl rollback over SSH or let the confirmation deadline restore the previous revision.
Read Architecture and the Configuration overview.