What's Actually Happening

OpenVPN client cannot establish connection to server. Tunnel fails to initialize or authentication fails.

The Error You'll See

```bash $ openvpn --config client.ovpn

TLS Error: TLS key negotiation failed to occur within 60 seconds TLS Error: TLS handshake failed ```

Certificate error:

bash
VERIFY ERROR: depth=0, error=certificate is not yet valid

Connection refused:

bash
TCP/UDP: Incoming packet rejected from [AF_INET]203.0.113.50:1194
Connection refused

Auth error:

bash
AUTH: Received AUTH_FAILED control message

Why This Happens

  1. 1.Certificate issues - Invalid, expired, or wrong certificates
  2. 2.Wrong configuration - Client config mismatch with server
  3. 3.Network blocking - Firewall or port blocking
  4. 4.Server unreachable - Cannot reach VPN server
  5. 5.Authentication failure - Wrong credentials
  6. 6.Protocol mismatch - TCP vs UDP mismatch

Step 1: Check OpenVPN Status

```bash # Check OpenVPN client status: systemctl status openvpn-client@client

# Check OpenVPN server status: systemctl status openvpn-server@server

# Check running processes: ps aux | grep openvpn

# Check logs: journalctl -u openvpn-client@client -f

# Or directly: tail -f /var/log/openvpn/client.log tail -f /var/log/openvpn/openvpn.log

# Run with verbose: openvpn --config client.ovpn --verb 4

# Maximum verbosity: openvpn --config client.ovpn --verb 9

# Check version: openvpn --version

# Check configuration: cat /etc/openvpn/client.ovpn cat /etc/openvpn/server.conf ```

Step 2: Check Network Connectivity

```bash # Test server reachable: ping vpn-server-ip

# Check port open: nc -zuv vpn-server-ip 1194

# For TCP: nc -zv vpn-server-ip 1194

# Using nmap: nmap -sU -p 1194 vpn-server-ip

# Check route to server: ip route get vpn-server-ip

# Check DNS resolution: nslookup vpn-server.example.com

# Check local firewall: iptables -L -n | grep 1194 ufw status | grep 1194

# Check NAT issues: # OpenVPN needs correct NAT traversal

# Test with different protocol: # If UDP fails, try TCP: openvpn --config client.ovpn --proto tcp-client

# Check for MTU issues: # Add to config: tun-mtu-extra 32 fragment 1300 mssfix 1300

# Test connection with debug: openvpn --config client.ovpn --verb 6 2>&1 | tee debug.log ```

Step 3: Verify Certificates

```bash # Check certificate files: ls -la /etc/openvpn/ ls -la /etc/openvpn/keys/

# Required files: # ca.crt - CA certificate # client.crt - Client certificate # client.key - Client private key # ta.key - TLS auth key (optional)

# Verify CA certificate: openssl x509 -in ca.crt -text -noout | head -20

# Check CA expiration: openssl x509 -in ca.crt -noout -dates

# Verify client certificate: openssl x509 -in client.crt -text -noout

# Check client cert expiration: openssl x509 -in client.crt -noout -dates

# Verify certificate chain: openssl verify -CAfile ca.crt client.crt

# Check certificate key match: openssl x509 -noout -modulus -in client.crt | openssl md5 openssl rsa -noout -modulus -in client.key | openssl md5 # MD5 hashes should match

# Check certificate validity: openssl x509 -in client.crt -noout -checkend 86400 # Returns 0 if valid for 24 hours

# Generate new certificates if needed: ./build-ca ./build-key client ./build-key-server server

# Or easyrsa: easyrsa build-client-full client1 nopass ```

Step 4: Fix Configuration Mismatch

```bash # Compare client and server configs:

# Client config must match: # Server IP/port remote vpn-server-ip 1194 udp

# Protocol (udp/tcp): proto udp

# Device type (tun/tap): dev tun

# Cipher: cipher AES-256-CBC # Or newer: data-ciphers AES-256-GCM:AES-128-GCM

# TLS auth: tls-auth ta.key 1

# CA certificate: ca ca.crt

# Check server config: cat /etc/openvpn/server.conf

# Server should have matching: proto udp port 1194 dev tun cipher AES-256-CBC tls-auth ta.key 0

# Key direction: # Client: tls-auth ta.key 1 # Server: tls-auth ta.key 0

# Check for config errors: grep -E "proto|port|dev|cipher" client.ovpn

# Common mismatches: # 1. proto mismatch (udp vs tcp) # 2. port mismatch # 3. cipher mismatch # 4. tls-auth missing/wrong direction

# Fix proto: proto udp # or proto tcp-client

# Fix cipher: cipher AES-256-CBC # Or negotiate: data-ciphers AES-256-GCM:AES-128-GCM:BF-CBC ncp-ciphers AES-256-GCM:AES-128-GCM ```

Step 5: Fix Authentication Issues

```bash # Check auth method in config: grep auth client.ovpn

# Static key auth: secret static.key

# Certificate auth: ca ca.crt cert client.crt key client.key

# Username/password auth: auth-user-pass auth-user-pass auth.txt

# Create auth file: echo "username" > auth.txt echo "password" >> auth.txt

# Check server auth config: grep auth /etc/openvpn/server.conf

# For LDAP auth: plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn

# Verify credentials: # Test with manual auth: openvpn --config client.ovpn --auth-user-pass

# Check PAM configuration: cat /etc/pam.d/openvpn

# For LDAP plugin: # Check LDAP server reachable: ldapsearch -x -H ldap://ldap-server -b "ou=users,dc=example,dc=com"

# Check auth timeout: # Increase in config: auth-retry nointeract hand-window 60 ```

Step 6: Check TLS Issues

```bash # TLS handshake errors:

# Check TLS auth key: ls -la ta.key

# Generate TLS auth key: openvpn --genkey secret ta.key

# TLS auth direction: # Server: tls-auth ta.key 0 # Client: tls-auth ta.key 1

# Check TLS version: # Force TLS 1.2+: tls-version-min 1.2

# Or allow 1.0: tls-version-min 1.0

# Check certificate verification: # Add to config: remote-cert-tls server

# This verifies server certificate type

# Increase TLS timeout: tls-timeout 60

# Check for replay attacks: # TLS auth prevents replay # Disable if issues: # tls-auth off

# Renegotiation interval: reneg-sec 3600

# Reduce if issues: reneg-sec 600

# Check key size: key-direction 1 ```

Step 7: Fix Firewall Issues

```bash # Check firewall rules: iptables -L -n -v | grep 1194

# Allow OpenVPN: iptables -I INPUT -p udp --dport 1194 -j ACCEPT iptables -I INPUT -p tcp --dport 1194 -j ACCEPT

# Allow forwarding: iptables -I FORWARD -i tun+ -j ACCEPT iptables -I FORWARD -o tun+ -j ACCEPT

# NAT for VPN clients: iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

# Using ufw: ufw allow 1194/udp ufw allow 1194/tcp

# Enable forwarding in ufw: # Edit /etc/default/ufw: DEFAULT_FORWARD_POLICY="ACCEPT"

# Using firewalld: firewall-cmd --add-port=1194/udp --permanent firewall-cmd --add-port=1194/tcp --permanent firewall-cmd --add-service=openvpn --permanent firewall-cmd --reload

# Check IP forwarding: cat /proc/sys/net/ipv4/ip_forward

# Enable IP forwarding: sysctl -w net.ipv4.ip_forward=1

# Or in /etc/sysctl.conf: net.ipv4.ip_forward = 1

# Apply sysctl: sysctl -p

# Check nftables: nft list ruleset | grep 1194 ```

Step 8: Handle MTU and Fragmentation

```bash # MTU issues cause connection drops:

# Check current MTU: ip link show tun0

# Common VPN MTU issues: # Default tun-mtu is 1500 # May need to reduce for overhead

# Fix MTU: tun-mtu 1400

# Or use fragmentation: fragment 1300 mssfix 1300

# Test MTU: ping -M do -s 1300 vpn-server-ip

# Reduce until works: ping -M do -s 1200 vpn-server-ip

# Set based on test: tun-mtu 1280 fragment 1200

# For PPPoE overhead: tun-mtu 1200

# Check for packet drops: tcpdump -i tun0 -n

# MTU discovery: mtu-disc yes mtu-test

# Add to config: link-mtu 1500 tun-mtu 1400 tun-mtu-extra 32 ```

Step 9: Check Routing Issues

```bash # Check routes after connection: ip route show

# Should see tun routes: # 10.8.0.0/24 via 10.8.0.1 dev tun0 # 0.0.0.0/1 via 10.8.0.1 dev tun0

# Check VPN gateway: ip route get 10.8.0.1

# Check redirect-gateway: grep redirect-gateway client.ovpn

# Redirect all traffic: redirect-gateway def1

# Redirect with DHCP: redirect-gateway def1 bypass-dhcp

# Check DNS pushed: grep dhcp-option client.ovpn

# Push DNS: dhcp-option DNS 10.8.0.1

# Manual route if not pushed: ip route add 192.168.100.0/24 via 10.8.0.1

# Check default route: ip route show default

# Verify traffic through tunnel: traceroute 8.8.8.8

# Should go through VPN gateway ```

Step 10: OpenVPN Verification Script

```bash # Create verification script: cat << 'EOF' > /usr/local/bin/check-openvpn.sh #!/bin/bash

CONFIG=${1:-"/etc/openvpn/client.ovpn"}

echo "=== OpenVPN Status ===" systemctl status openvpn-client@* 2>/dev/null || systemctl status openvpn 2>/dev/null || echo "Service not running"

echo "" echo "=== Process ===" ps aux | grep openvpn | grep -v grep || echo "No OpenVPN process"

echo "" echo "=== Configuration ===" cat $CONFIG 2>/dev/null | grep -E "remote|proto|port|dev|cipher|ca|cert|key" || echo "Config not found"

echo "" echo "=== Certificate Files ===" ls -la /etc/openvpn/*.crt /etc/openvpn/*.key /etc/openvpn/*.pem 2>/dev/null || echo "No certificates found"

echo "" echo "=== Certificate Expiration ===" for cert in /etc/openvpn/*.crt; do if [ -f "$cert" ]; then echo "$cert:" openssl x509 -in $cert -noout -dates 2>/dev/null || echo " Cannot read" fi done

echo "" echo "=== Network Connectivity ===" remote=$(grep "^remote" $CONFIG 2>/dev/null | head -1 | awk '{print $2}') if [ -n "$remote" ]; then echo "Server: $remote" ping -c 2 -W 2 $remote 2>&1 || echo "Cannot reach server" port=$(grep "^remote" $CONFIG 2>/dev/null | head -1 | awk '{print $3}') if [ -n "$port" ]; then nc -zuv $remote $port 2>&1 || echo "Port $port not reachable" fi fi

echo "" echo "=== Firewall ===" iptables -L -n 2>/dev/null | grep 1194 || echo "No iptables rule for 1194"

echo "" echo "=== IP Forwarding ===" cat /proc/sys/net/ipv4/ip_forward

echo "" echo "=== Tun Interface ===" ip link show tun0 2>/dev/null || echo "No tun interface"

echo "" echo "=== Recent Logs ===" journalctl -u openvpn --no-pager -n 10 2>/dev/null || tail /var/log/openvpn/*.log 2>/dev/null | head -20

echo "" echo "=== Recommendations ===" echo "1. Verify certificates are valid and not expired" echo "2. Check server IP and port are correct" echo "3. Ensure proto (udp/tcp) matches server" echo "4. Allow port 1194 in firewall" echo "5. Enable IP forwarding" echo "6. Check TLS auth key direction" echo "7. Adjust MTU if connection drops" EOF

chmod +x /usr/local/bin/check-openvpn.sh

# Usage: /usr/local/bin/check-openvpn.sh /etc/openvpn/client.ovpn ```

OpenVPN Connection Checklist

CheckExpected
Server reachablePing and port test work
Certificates validNot expired, chain valid
Protocol matchUDP/TCP matches server
Firewall openPort 1194 allowed
TLS authKey direction correct
IP forwardingEnabled
ConfigurationMatches server settings

Verify the Fix

```bash # After fixing OpenVPN connection

# 1. Run OpenVPN openvpn --config client.ovpn // Connection established

# 2. Check logs tail -f /var/log/openvpn/client.log // "Initialization Sequence Completed"

# 3. Check interface ip addr show tun0 // Has IP address

# 4. Check routes ip route show | grep tun // Routes through VPN

# 5. Test connectivity ping 10.8.0.1 // VPN gateway reachable

# 6. Check traffic routing traceroute 8.8.8.8 // Goes through VPN tunnel ```

  • [Fix WireGuard Handshake Failed](/articles/fix-wireguard-handshake-failed)
  • [Fix IPsec Tunnel Not Establishing](/articles/fix-ipsec-tunnel-not-establishing)
  • [Fix SSH Connection Refused](/articles/fix-ssh-connection-refused)