OVPN Connect Script

Simple script to automate connection to OVPN with OTP authentication.

Table of Contents

Server

For server setup you can use this repo as reference.

Script

 1#!/usr/bin/env bash
 2
 3# -----------------------------------------------
 4# VPN Management Script
 5# -----------------------------------------------
 6
 7PARAM_START='start'
 8PARAM_STOP='stop'
 9PARAM_STATUS='status'
10PARAM_HELP='help'
11
12USERNAME='yourUsername'
13
14HELP_MSG="PARAMETERS: start, stop, status, help. Example: 'vpn start'"
15ERROR_MSG="Run 'vpn help' for a list of allowed parameters."
16
17# Map VPN shortcuts to configuration files and TOTP keys
18declare -A VPN_CONFIGS=(
19    ["server1"]="~/.ovpn/server1.ovpn"
20    ["server2"]="~/.ovpn/server2.ovpn"
21    ["server3"]="~/.ovpn/server3.ovpn"
22
23)
24
25declare -A VPN_TOTP=(
26    ["server1"]="TOTP1-SECRET"
27    ["server2"]="TOTP2-SECRET"
28    ["server3"]="TOTP3-SECRET"
29)
30
31# Select VPN config based on second argument
32if [[ -n "${VPN_CONFIGS[$2]}" ]]; then
33    OVPN_FILE_PATH="${VPN_CONFIGS[$2]}"
34    TOTP_NOW="$(oathtool -b --totp "${VPN_TOTP[$2]}")"
35else
36    echo 'null' >/tmp/ovpn.out 2>&1 &
37fi
38
39# -----------------------------------------------
40# VPN Functions
41# -----------------------------------------------
42
43start_vpn() {
44    # Uncomment this if you configure OVPN to have prefix in auth
45    # OVPN_PREFIX="your_custom_ovpn_prefix"
46    # TOTP_NOW="${OVPN_PREFIX}?${TOTP_NOW}"
47
48    echo "TOTP: $TOTP_NOW"
49    echo "Connecting to VPN..."
50    
51    nohup openvpn --config "$OVPN_FILE_PATH" \
52        --auth-user-pass <(echo -e "$USERNAME\n$TOTP_NOW") \
53        --script-security 2 \
54        --setenv PATH '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' \
55        --up /usr/bin/update-systemd-resolved \
56        --up-restart \
57        --down /usr/bin/update-systemd-resolved \
58        --down-pre \
59        >/tmp/ovpn.out 2>&1 &
60
61    echo "Connected!"
62}
63
64stop_vpn() {
65    echo "Stopping VPN Connection..."
66    sudo killall openvpn
67    echo "Removing VPN tunnel if exists..."
68    sudo ip link delete tun0
69    echo "Disconnected!"
70}
71
72status_vpn() {
73    ps -a | grep openvpn
74    echo "VPN running in this process."
75}
76
77# -----------------------------------------------
78# Main Logic
79# -----------------------------------------------
80case "$1" in
81    "$PARAM_START") start_vpn ;;
82    "$PARAM_STOP") stop_vpn ;;
83    "$PARAM_STATUS") status_vpn ;;
84    "$PARAM_HELP") echo "$HELP_MSG" ;;
85    *) echo "$ERROR_MSG" ;;
86esac