OpenVPN
2024-11-10
As I mentioned in my previous post on VPNs, it's pretty easy to set up an OpenVPN server. This is my quick setup guide and pretty much what I use on my Debian VPS. I have PKI set up on a different local machine and that's where I generate my client configs. Once set up you only need a single .ovpn file for a client to connect.
Config files for openvpn server go to: /etc/openvpn/server
Files you want to have there:
- avpn.conf
- ca.crt
- avpn.crt
- avpn.key
- ta.key
The 'avpn' part is simply a name for my config, so you can change it with no problem, just be consistent.
Install the proper package, move config files, then enable 'openvpn-server@avpn' service. Update your DNS entries for the VPN access too. Setup with cloud-init and my server conf follows.
cloud-init
#cloud-config
package_update: true
package_upgrade: true
packages:
- openvpn
- ufw
- ca-certificates
runcmd:
- ufw allow 1194/udp
- ufw allow 22/tcp
- ufw enable
- |
cat <<'EOF' > /root/openvpn-ready.sh
#!/bin/bash
CONFIG_FILE="/etc/openvpn/server/avpn.conf"
if [ -f "$CONFIG_FILE" ]; then
systemctl enable --now openvpn-server@avpn
systemctl status openvpn-server@avpn
echo "OpenVPN service enabled"
else
echo "Please copy your configuration to $CONFIG_FILE and run this script again."
fi
EOF
- chmod +x /root/openvpn-ready.sh
final_message: "Cloud-Init finished. Copy your OpenVPN configuration files to /etc/openvpn/server/avpn.conf and run /root/openvpn-ready.sh"
avpn.conf
port 1194
proto udp4
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/avpn.crt
key /etc/openvpn/server/avpn.key
topology subnet
server 10.8.0.0 255.255.255.0
keepalive 10 120
dh none
ecdh-curve secp384r1
tls-crypt /etc/openvpn/server/ta.key
auth-nocache
cipher AES-256-GCM
data-ciphers AES-256-GCM
auth SHA512
persist-key
persist-tun
verb 5
client-to-client
explicit-exit-notify 1
Below is a script that I use to generate my client keys and .ovpn config files. Omit spaces within tags.
add-vpn-client.sh
#!/bin/bash
name="client-$1"
echo $name
export EASYRSA=$PWD
easyrsa gen-req $name nopass
easyrsa sign-req client $name
mkdir $name
cp $EASYRSA/pki/private/$name.key ./$name/
cp $EASYRSA/pki/issued/$name.crt ./$name/
chmod go+r -R $name
echo "writing .ovpn config"
touch ./$name/avpn.ovpn
cat >> ./$name/avpn.ovpn << EOF
client
remote vpn.wykwit.pl 1194
proto udp4
dev tun
ca [inline]
cert [inline]
key [inline]
tls-crypt [inline]
ecdh-curve secp384r1
cipher AES-256-GCM
auth SHA512
< ca >
EOF
cat ca.crt >> ./$name/avpn.ovpn
cat >> ./$name/avpn.ovpn << EOF
< /ca >
< cert >
EOF
cat ./$name/$name.crt >> ./$name/avpn.ovpn
cat >> ./$name/avpn.ovpn << EOF
< /cert >
< key >
EOF
cat ./$name/$name.key >> ./$name/avpn.ovpn
cat >> ./$name/avpn.ovpn << EOF
< /key >
< tls-crypt >
EOF
cat ta.key >> ./$name/avpn.ovpn
cat >> ./$name/avpn.ovpn << EOF
< /tls-crypt >
EOF
Setting up PKI with Easy-RSA is described very well on ArchWiki: https://wiki.archlinux.org/title/Easy-RSA