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