Your office laptop can dial in from home and still serve something the office needs, but only when three separate decisions line up. The tunnel is transport, the inner address is the destination, and policy decides who may knock. Treating any one of those as the whole answer produces the familiar complaint that the host answers pings but the application never connects. The roles are not the same, and the difference is exactly where the design work lives.

The dial-in direction says nothing about service direction

When a client starts a tunnel, it opens a path that both directions can use once it exists. Whether a new connection may enter from the hub toward that client is a gateway policy question, not a property of who dialled. On a routed OpenVPN hub, for example, the server needs a route to the client's inner address and forwarding that permits the peer relationship.

Picture an inventory system that polls an agent on roaming laptops, or a developer who needs a test API from a workstation at home. Both want the office side to start the conversation, which is the reverse of the usual client-to-server pattern.

Hosted remote-access products vary here, and the variation is not a bug. Some managed service VPNs deliberately block unsolicited connections toward connected clients because their model is client-to-resource, not resource-to-client. Read the product's documented architecture before promising a colleague that their laptop can act as a server.

Follow the reply path before opening a port

The path has three parts: a route on the gateway that points at the client's inner address, policy that allows the specific caller, and a listening service on the target. Each part fails differently, which is why "the VPN is up" tells you almost nothing.

The good news is that the inner path does not need a port forward on the client's home router. That is the point of publishing the service on the tunnel address rather than on the home WAN address, where the exposure and the NAT rules would be entirely different. A home router may also refuse to hairpin a connection that arrives from the office, so the WAN route fails for reasons unrelated to your VPN. Keeping the traffic inside the tunnel avoids both problems at once.

Check the target side as well. A service bound only to 127.0.0.1 cannot accept a connection arriving on the tunnel interface, no matter how correct the gateway routes are. A host firewall rule that permits the port only from the local subnet will also drop office traffic, and that rule is independent of the VPN policy above it.

Names and addresses are design decisions

An address inside the tunnel is not automatically a name. A private DNS record you control is clearer than hoping a discovery protocol crosses the tunnel, because link-local multicast name resolution stays on the local segment and does not become cross-subnet DNS.

Address stability matters just as much. If VPN clients draw from a pool with short leases, the laptop's inner address changes between sessions and every bookmark, firewall scope and monitoring check built on it breaks quietly. Use a reservation or a documented dynamic update path.

Agree the name with whoever owns the VPN identity, so the record, the address assignment and the access policy change together rather than in three separate tickets.

Test the service, not the membership

From the target, confirm what is listening and on which address, then confirm the gateway's view of the return path:

$ ss -ltnp | grep 8080
LISTEN 0 128 10.80.0.23:8080 0.0.0.0:*
$ ip -4 addr show tun0 | grep inet
inet 10.80.0.23/24 scope global tun0
$ ip route get 10.80.0.1
10.80.0.1 dev tun0 src 10.80.0.23

Now test from the office side with a real request rather than an echo. A successful curl against the service proves the route, the policy and the listener at once, while a ping success proves only that ICMP is permitted. If the request fails, work backwards through the three parts instead of widening the firewall and hoping.

Availability belongs in the same conversation. A laptop sleeps, roams between networks and disconnects at the end of the day. A service that must answer at any hour belongs on an always-on host, while a service that is best-effort can stay on the client with that limitation written down.

Publish the resource deliberately, with a name, an allowed caller list and an owner, and the remote device becomes a supported service rather than an accidental server.

ບົດຄວາມທີ່ກ່ຽວຂ້ອງ