OpenVPN:User Management
OpenVPN User Management
This document covers managing OpenVPN users (clients) including adding, removing, and managing client certificates.
Overview
OpenVPN uses certificate-based authentication. Each user (client) requires:
A unique client certificate
A client configuration file (.ovpn)
Optionally, a static IP assignment via CCD file
Current Users
Client configuration files are stored in /root/:
josh.ovpn
Work_MacBook_Air.ovpn
StrawberryNAS.ovpn (Synology NAS with static IP 10.8.0.2)
Adding a New User
Method 1: Using the OpenVPN Install Script (Recommended)
If you have the openvpn-install.sh script available:
= Run the installer script = bash /root/openvpn-install.sh = Select option to add a new client = = Follow the prompts to enter the client name = = The script will automatically: = = - Generate the client certificate = = - Create the .ovpn configuration file = = - Place it in /root/ =
Method 2: Manual Certificate Creation with Easy-RSA
For manual certificate creation:
Navigate to Easy-RSA directory:
cd /etc/openvpn/server/easy-rsa/
Generate client certificate and key:
./easyrsa build-client-full clientname nopass
Replaceclientnamewith the desired client name (e.g.,newuser,laptop-john). Thenopassoption creates a certificate without a password. Remove it if you want password protection.
Create client configuration file:
You'll need to create a.ovpnfile that combines: Client certificate Client private key CA certificate TLS-Crypt key Connection settings Use an existing.ovpnfile as a template:
cp /root/josh.ovpn /root/newclient.ovpn
Then extract and replace the certificate sections:
# Extract client certificate from Easy-RSA cat /etc/openvpn/server/easy-rsa/pki/issued/clientname.crt # Extract client key cat /etc/openvpn/server/easy-rsa/pki/private/clientname.key # Replace the <cert> and <key> sections in the .ovpn file
Verify the configuration:
# Test the .ovpn file syntax openvpn --config /root/newclient.ovpn --test-crypto
Method 3: Using Easy-RSA Helper Script
Create a helper script to automate the process:
#!/bin/bash
= /root/create-openvpn-client.sh =
CLIENT_NAME=$1
if [ -z "$CLIENT_NAME" ]; then
echo "Usage: $0 <client-name>"
exit 1
fi
cd /etc/openvpn/server/easy-rsa/
= Generate client certificate =
./easyrsa build-client-full "$CLIENT_NAME" nopass
= Create .ovpn file =
CLIENT_DIR="/root"
OVPN_FILE="$CLIENT_DIR/$CLIENT_NAME.ovpn"
= Start with common client configuration =
cat > "$OVPN_FILE" << EOF
client
dev tun
proto udp
remote 87.106.61.62 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
ignore-unknown-option block-outside-dns
verb 3
EOF
= Add CA certificate =
echo "<ca>" >> "$OVPN_FILE"
cat /etc/openvpn/server/ca.crt >> "$OVPN_FILE"
echo "</ca>" >> "$OVPN_FILE"
= Add client certificate =
echo "<cert>" >> "$OVPN_FILE"
cat "/etc/openvpn/server/easy-rsa/pki/issued/$CLIENT_NAME.crt" >> "$OVPN_FILE"
echo "</cert>" >> "$OVPN_FILE"
= Add client key =
echo "<key>" >> "$OVPN_FILE"
cat "/etc/openvpn/server/easy-rsa/pki/private/$CLIENT_NAME.key" >> "$OVPN_FILE"
echo "</key>" >> "$OVPN_FILE"
= Add TLS-Crypt key =
echo "<tls-crypt>" >> "$OVPN_FILE"
cat /etc/openvpn/server/tc.key >> "$OVPN_FILE"
echo "</tls-crypt>" >> "$OVPN_FILE"
echo "Client configuration created: $OVPN_FILE"
echo "Send this file securely to the client."
Make it executable:
chmod +x /root/create-openvpn-client.sh
Usage:
/root/create-openvpn-client.sh newclientname
Assigning Static IP Addresses
To assign a static IP address to a client:
Create a CCD file in /etc/openvpn/ccd/:
sudo nano /etc/openvpn/ccd/clientname
Add IP assignment:
ifconfig-push 10.8.0.X 255.255.255.0
ReplaceXwith the desired IP (e.g.,10.8.0.10).
Set proper permissions:
sudo chown nobody:nogroup /etc/openvpn/ccd/clientname sudo chmod 600 /etc/openvpn/ccd/clientname
Restart OpenVPN (if needed):
sudo systemctl restart openvpn
Example: The Synology NAS has a CCD file at /etc/openvpn/ccd/StrawberryNAS with:
ifconfig-push 10.8.0.2 255.255.255.0
Listing Active Users
To see which users are currently connected:
= View IP persistence file (shows last assigned IPs) = cat /etc/openvpn/server/ipp.txt = Check active connections via system logs = journalctl -u openvpn | grep "Peer Connection Initiated" = Or check the VPN interface = ip addr show tun0
Revoking a User Certificate
When a user should no longer have access:
Navigate to Easy-RSA directory:
cd /etc/openvpn/server/easy-rsa/
Revoke the certificate:
./easyrsa revoke clientname
You'll be prompted to confirm. Type yes.
Update the Certificate Revocation List (CRL):
./easyrsa gen-crl
Copy the updated CRL to the server directory:
cp pki/crl.pem /etc/openvpn/server/crl.pem
Restart OpenVPN to apply the revocation:
systemctl restart openvpn
Remove client files (optional but recommended):
# Remove .ovpn file rm /root/clientname.ovpn # Remove CCD file if it exists rm /etc/openvpn/ccd/clientname
Note: The revoked certificate will be immediately rejected. The user will not be able to connect even if they still have the .ovpn file.
Security Best Practices
Use descriptive client names: Use names that identify the device/user (e.g., laptop-john, phone-mary, nas-synology)
Regular certificate rotation: Renew certificates before expiration (typically annually)
Revoke unused certificates: Remove access for users who no longer need VPN access
Secure .ovpn file distribution: Use secure channels (encrypted email, secure file transfer) when sending .ovpn files to clients
Limit static IP assignments: Only assign static IPs when necessary (e.g., for services like the Synology NAS)
Monitor active connections: Regularly check who is connected and verify it's expected
Keep Easy-RSA secure: The Easy-RSA directory contains sensitive keys - restrict access:
chmod 700 /etc/openvpn/server/easy-rsa/
Backup User Certificates
Before making changes, backup user certificates:
= Backup all certificates and keys = tar -czf openvpn-users-backup-$(date +%Y%m%d).tar.gz \ /etc/openvpn/server/easy-rsa/pki/ \ /root/''.ovpn \ /etc/openvpn/ccd/
Related Documentation
[Server Configuration](server-configuration.md) - Server setup [Client Configuration](client-configuration.md) - Client setup [Certificate Management](certificate-management.md) - Certificate details Troubleshooting - User management troubleshooting