"Connection timed out" is the least specific error a VPN client can print. It means one operation missed its deadline, and every stage from name resolution to the login reply has a deadline. Clients that only show the final message make the stages look identical, so people raise the timeout, change the port, and reinstall the profile, in that order, without learning anything. Comparing the stages is faster: each one fails in a different place, and each failure leaves a different kind of evidence behind.

Four stages, four different failures

The sequence is fixed even when the client hides it: the name must resolve, a transport must be established to the resulting address, the protocol must negotiate its parameters and keys, and the account must be authenticated. OpenVPN's connectivity troubleshooting guide walks the same order for its own client, and the others follow it closely. A timeout at stage two and a timeout at stage four have nothing in common except the word on the screen.

StageLooks likeWhat it does not prove
Name resolutionfails in under a second, before any contactnothing about the server being up
Transportwaits the full timeout, then gives upnothing about the VPN service behind the port
Negotiationconnects, then stalls at handshakenothing about credentials
Logina reply arrives and is rejected or hangs on a promptnothing about reachability

Read the log for the last line that indicates progress rather than the last line before the error. Most clients print something like a resolved address, an established socket, a started handshake, or an authentication request, and the stage that follows that line is the one that timed out.

Name resolution fails before anything is contacted

If the endpoint never resolves, the client has nothing to connect to and no transport work has happened. That failure is usually instant rather than a full timeout, which is the cheapest way to tell it apart from the rest. Test the name with the system resolver and with a second resolver, and compare the two answers before you conclude the server is down.

An old address copied from a forum post is a common cause of a timeout that looks like a server problem, because the address now belongs to something else or to nothing. Use the operator's current profile instead of substituting an address that used to work. A missing ping reply is not evidence either way: plenty of endpoints drop ICMP while serving perfectly well.

Transport setup waits for a packet that will not come

When DNS is fine and the client still burns the whole timeout, the transport layer is the suspect. On TCP you can test the port directly; Test-NetConnection on Windows or nc -vz on Linux tells you whether something accepts the connection, and that is more useful than a ping. On UDP you cannot test the same way, because there is no handshake to complete at that layer, and this asymmetry causes a lot of mistaken conclusions.

What a TCP test proves is limited: a service accepting port 443 is not necessarily the VPN listener, and a UDP-only endpoint has no TCP port to accept anything. Rewriting a profile from UDP to TCP does not create a listener on the other side; it only changes what your client waits for. If the network filters the protocol, the change produces a different timeout at the same stage.

Captive portals deserve their own check at this stage. Until the portal authorises the device, outbound traffic goes to the portal and the tunnel attempt simply hangs. Complete the portal in a browser first, then retry, and do not change the profile while the portal is still pending.

Negotiation and login mean the server answered

Once the tunnel reaches the server, the client starts a handshake and the error changes character. A stall here is about compatibility rather than reachability: mismatched protocol versions, a cipher or data-channel setting the other side will not accept, or a profile that expects a feature the server does not offer. OpenVPN moved its negotiation defaults between major versions often enough that a profile written for one generation can reach the server and still fail to come up.

Authentication is the last stage and the easiest to misread. An explicit rejection is a response, which means the path works and the problem is the identity, the certificate, or the account state. A browser-based single sign-on flow is a third case: the client is waiting for an action you have not taken, or for a browser it cannot launch, and nothing will arrive until you finish that step.

Compare the evidence before changing the retry

Keep the device and profile fixed and change one thing at a time, starting with the network. If the same profile connects on a phone hotspot and times out on hotel Wi-Fi, the path is the variable, not the server. If it fails everywhere, the profile or the endpoint is the variable. If it fails only at one time of day, capture the timestamp and compare it with server-side events before assuming anything about load.

For a service you administer, the decisive comparison is whether the attempt arrives at all. A connection that reaches the listener and then stalls belongs to the negotiation stage; one that never shows up in the listener's view is a transport or resolution problem, and no amount of retry tuning will move it. Server logs also separate a rejected login from a silent drop, which is the difference between an identity fix and a firewall fix.

Record the client version, the profile name, the attempt time with its timezone, and the first useful error rather than the final disconnected line. Strip keys and credential-bearing material before you share the excerpt. Then make one meaningful correction and retry, because a longer deadline only helps the documented slow operation, and it does nothing for a wrong address or a blocked port.

Ngaahi tokoni fekau'aki