Skip to content
Snippets Groups Projects
freedombone-app-vpn 24.1 KiB
Newer Older
Bob Mottram's avatar
Bob Mottram committed
#!/bin/bash
Bob Mottram's avatar
Bob Mottram committed
#  _____               _           _
# |   __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
# |   __|  _| -_| -_| . | . |     | . | . |   | -_|
# |__|  |_| |___|___|___|___|_|_|_|___|___|_|_|___|
Bob Mottram's avatar
Bob Mottram committed
#
Bob Mottram's avatar
Bob Mottram committed
#                              Freedom in the Cloud
Bob Mottram's avatar
Bob Mottram committed
#
# VPN functions
Bob Mottram's avatar
Bob Mottram committed
# https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-debian-8
# https://jamielinux.com/blog/force-all-network-traffic-through-openvpn-using-iptables/
# http://www.farrellf.com/projects/software/2016-05-04_Running_a_VPN_Server_with_OpenVPN_and_Stunnel/index_.php
Bob Mottram's avatar
Bob Mottram committed
#
# License
# =======
#
Bob Mottram's avatar
Bob Mottram committed
# Copyright (C) 2014-2019 Bob Mottram <bob@freedombone.net>
Bob Mottram's avatar
Bob Mottram committed
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

Bob Mottram's avatar
Bob Mottram committed
VARIANTS='full full-vim'
Bob Mottram's avatar
Bob Mottram committed
APP_CATEGORY=other

NOT_ON_HOMEPAGE=1
REQUIRES_APP=
OPENVPN_SERVER_NAME="server"
OPENVPN_KEY_FILENAME='client.ovpn'
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
VPN_COUNTRY_CODE="US"
VPN_AREA="Apparent Free Speech Zone"
VPN_LOCATION="Freedomville"
VPN_ORGANISATION="Freedombone"
VPN_UNIT="Freedombone Unit"
STUNNEL_PORT=3439
VPN_TLS_PORT=553
Bob Mottram's avatar
Bob Mottram committed
VPN_MESH_TLS_PORT=653
Bob Mottram's avatar
Bob Mottram committed
vpn_variables=(MY_EMAIL_ADDRESS
Bob Mottram's avatar
Bob Mottram committed
               DEFAULT_DOMAIN_NAME
               MY_USERNAME
               VPN_COUNTRY_CODE
               VPN_AREA
               VPN_LOCATION
               VPN_ORGANISATION
               VPN_UNIT
               VPN_TLS_PORT)
function upgrade_distro_vpn {
    target_distro="$1"

    if [[ "$target_distro" == 'buster' ]]; then
        echo -n ''
    fi
}

function change_default_domain_name_vpn {
    new_default_domain_name="$1"

    for d in /home/*/ ; do
        USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
        if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
            user_vpn_cert_file=/home/$USERNAME/$OPENVPN_KEY_FILENAME

            { echo 'client';
              echo 'dev tun';
              echo 'proto tcp';
              echo "remote localhost $STUNNEL_PORT";
              echo "route $new_default_domain_name 255.255.255.255 net_gateway";
              echo 'resolv-retry infinite';
              echo 'nobind';
              echo 'tun-mtu 1500';
              echo 'tun-mtu-extra 32';
              echo 'mssfix 1450';
              echo 'persist-key';
              echo 'persist-tun';
              echo 'auth-nocache';
              echo 'remote-cert-tls server';
              echo 'comp-lzo';
              echo 'verb 3';
              echo ''; } > "$user_vpn_cert_file"
            chown "$USERNAME":"$USERNAME" "$user_vpn_cert_file"
        fi
    done

    { echo '[openvpn]';
      echo 'client = yes';
      echo "accept = $STUNNEL_PORT";
      echo "connect = $new_default_domain_name:$VPN_TLS_PORT";
      echo 'cert = stunnel.pem';
      echo 'protocol = socks'; } > /etc/stunnel/stunnel-client.conf

    systemctl restart openvpn
}

function logging_on_vpn {
    if [ ! -f /etc/openvpn/server.conf ]; then
        return
    fi
Bob Mottram's avatar
Bob Mottram committed
    sed -i 's|status .*|status /var/log/openvpn.log|g' /etc/openvpn/server.conf
    systemctl restart openvpn
    if [ ! -f /etc/openvpn/server.conf ]; then
        return
    fi
Bob Mottram's avatar
Bob Mottram committed
    sed -i 's|status .*|status /dev/null|g' /etc/openvpn/server.conf
    systemctl restart openvpn
function install_interactive_vpn {
Bob Mottram's avatar
Bob Mottram committed
    read_config_param VPN_TLS_PORT
    if [ ! $VPN_TLS_PORT ]; then
        VPN_TLS_PORT=553
    fi
Bob Mottram's avatar
Bob Mottram committed
    VPN_DETAILS_COMPLETE=
    while [ ! $VPN_DETAILS_COMPLETE ]
    do
Bob Mottram's avatar
Bob Mottram committed
        data=$(mktemp 2>/dev/null)
Bob Mottram's avatar
Bob Mottram committed
        currtlsport=$(grep 'VPN_TLS_PORT' temp.cfg | awk -F '=' '{print $2}')
Bob Mottram's avatar
Bob Mottram committed
        if [ "$currtlsport" ]; then
Bob Mottram's avatar
Bob Mottram committed
            VPN_TLS_PORT=$currtlsport
        fi
Bob Mottram's avatar
Bob Mottram committed
        dialog --backtitle $"Freedombone Configuration" \
               --title $"VPN Configuration" \
Bob Mottram's avatar
Bob Mottram committed
               --form $"\\nPlease enter your VPN details. Changing the port to 443 will help defend against censorship but will prevent other web apps from running." 12 65 1 \
Bob Mottram's avatar
Bob Mottram committed
               $"TLS port:" 1 1 "$VPN_TLS_PORT" 1 12 5 5 \
Bob Mottram's avatar
Bob Mottram committed
               2> "$data"
Bob Mottram's avatar
Bob Mottram committed
        sel=$?
        case $sel in
Bob Mottram's avatar
Bob Mottram committed
            1) rm -f "$data"
               exit 1;;
            255) rm -f "$data"
                 exit 1;;
Bob Mottram's avatar
Bob Mottram committed
        esac
Bob Mottram's avatar
Bob Mottram committed
        tlsport=$(sed -n 1p < "$data")
Bob Mottram's avatar
Bob Mottram committed
        if [ ${#tlsport} -gt 1 ]; then
            if [[ "$tlsport" != *' '* && "$tlsport" != *'.'* ]]; then
                VPN_TLS_PORT="$tlsport"
                VPN_DETAILS_COMPLETE="yes"
                write_config_param "VPN_TLS_PORT" "$VPN_TLS_PORT"
            fi
        fi
Bob Mottram's avatar
Bob Mottram committed
        rm -f "$data"
Bob Mottram's avatar
Bob Mottram committed
    done
Bob Mottram's avatar
Bob Mottram committed
function vpn_change_tls_port {
Bob Mottram's avatar
Bob Mottram committed
    if ! grep -q "VPN-TLS" "$FIREWALL_CONFIG"; then
        EXISTING_VPN_TLS_PORT=443
    else
Bob Mottram's avatar
Bob Mottram committed
        EXISTING_VPN_TLS_PORT=$(grep "VPN-TLS" "$FIREWALL_CONFIG" | awk -F '=' '{print $2}')
Bob Mottram's avatar
Bob Mottram committed
    data=$(mktemp 2>/dev/null)
Bob Mottram's avatar
Bob Mottram committed
    dialog --title $"VPN Configuration" \
           --backtitle $"Freedombone Control Panel" \
Bob Mottram's avatar
Bob Mottram committed
           --inputbox $'Change TLS port' 10 50 "$EXISTING_VPN_TLS_PORT" 2>"$data"
Bob Mottram's avatar
Bob Mottram committed
    sel=$?
    case $sel in
        0)
Bob Mottram's avatar
Bob Mottram committed
            tlsport=$(<"$data")
Bob Mottram's avatar
Bob Mottram committed
            if [ ${#tlsport} -gt 0 ]; then
                if [[ "$tlsport" != "$EXISTING_VPN_TLS_PORT" ]]; then
Bob Mottram's avatar
Bob Mottram committed
                    clear
Bob Mottram's avatar
Bob Mottram committed
                    VPN_TLS_PORT=$tlsport
                    write_config_param "VPN_TLS_PORT" "$VPN_TLS_PORT"
                    sed -i "s|accept =.*|accept = $VPN_TLS_PORT|g" /etc/stunnel/stunnel.conf
                    sed -i "s|connect =.*|connect = :$VPN_TLS_PORT|g" /etc/stunnel/stunnel-client.conf
Bob Mottram's avatar
Bob Mottram committed

                    for d in /home/*/ ; do
                        USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
Bob Mottram's avatar
Bob Mottram committed
                        if [ -f "/home/$USERNAME/stunnel-client.conf" ]; then
                            cp "/etc/stunnel/stunnel-client.conf" "/home/$USERNAME/stunnel-client.conf"
                            chown "$USERNAME":"$USERNAME" "/home/$USERNAME/stunnel-client.conf"
Bob Mottram's avatar
Bob Mottram committed
                    if [ "$VPN_TLS_PORT" -eq 443 ]; then
                        if [[ "$PREVIOUS_VPN_TLS_PORT" != "443" ]]; then
Bob Mottram's avatar
Bob Mottram committed
                            firewall_remove VPN-TLS "${EXISTING_VPN_TLS_PORT}"
Bob Mottram's avatar
Bob Mottram committed
                        systemctl stop nginx
                        systemctl disable nginx
                    else
                        if [[ "$PREVIOUS_VPN_TLS_PORT" != "$VPN_TLS_PORT" ]]; then
Bob Mottram's avatar
Bob Mottram committed
                            firewall_remove VPN-TLS "${EXISTING_VPN_TLS_PORT}"
                            firewall_add VPN-TLS "${VPN_TLS_PORT}" tcp
Bob Mottram's avatar
Bob Mottram committed
                        systemctl enable nginx
                        systemctl restart nginx
                    fi

                    systemctl restart stunnel

Bob Mottram's avatar
Bob Mottram committed
                    if [ "$VPN_TLS_PORT" -eq 443 ]; then
                        dialog --title $"VPN Configuration" \
                               --msgbox $"TLS port changed to ${VPN_TLS_PORT}. Forward this port from your internet router." 10 60
                    else
                        dialog --title $"VPN Configuration" \
                               --msgbox $"TLS port changed to ${VPN_TLS_PORT}. Forward this port from your internet router." 10 60
                    fi
Bob Mottram's avatar
Bob Mottram committed
    rm -f "$data"
Bob Mottram's avatar
Bob Mottram committed
function vpn_regenerate_client_keys {
Bob Mottram's avatar
Bob Mottram committed
    data=$(mktemp 2>/dev/null)
Bob Mottram's avatar
Bob Mottram committed
    dialog --title $"Regenerate VPN keys for a user" \
           --backtitle $"Freedombone Control Panel" \
Bob Mottram's avatar
Bob Mottram committed
           --inputbox $'username' 10 50 2>"$data"
Bob Mottram's avatar
Bob Mottram committed
    sel=$?
    case $sel in
        0)
Bob Mottram's avatar
Bob Mottram committed
            USERNAME=$(<"$data")
Bob Mottram's avatar
Bob Mottram committed
            if [ ${#USERNAME} -gt 0 ]; then
Bob Mottram's avatar
Bob Mottram committed
                if [ -d "/home/$USERNAME" ]; then
Bob Mottram's avatar
Bob Mottram committed
                    clear
Bob Mottram's avatar
Bob Mottram committed
                    create_user_vpn_key "$USERNAME"
Bob Mottram's avatar
Bob Mottram committed
                    dialog --title $"Regenerate VPN keys for a user" \
                           --msgbox $"VPN keys were regenerated for $USERNAME" 6 60
                fi
            fi
            ;;
    esac
Bob Mottram's avatar
Bob Mottram committed
    rm -f "$data"
Bob Mottram's avatar
Bob Mottram committed
function configure_interactive_vpn {
    read_config_param VPN_TLS_PORT
    while true
    do
        W=(1 $"Change TLS port (currently $VPN_TLS_PORT)"
           2 $"Regenerate keys for a user")

        # shellcheck disable=SC2068
        selection=$(dialog --backtitle $"Freedombone Administrator Control Panel" --title $"VPN" --menu $"Choose an operation, or ESC to exit:" 10 60 2 "${W[@]}" 3>&2 2>&1 1>&3)

        if [ ! "$selection" ]; then
            break
        fi

        case $selection in
Bob Mottram's avatar
Bob Mottram committed
            1) vpn_change_tls_port;;
Bob Mottram's avatar
Bob Mottram committed
            2) vpn_regenerate_client_keys;;
function reconfigure_vpn {
    echo -n ''
function upgrade_vpn {
    echo -n ''
Bob Mottram's avatar
Bob Mottram committed
function backup_local_vpn {
    for d in /home/*/ ; do
        USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
Bob Mottram's avatar
Bob Mottram committed
        if [ -f "/home/$USERNAME/$OPENVPN_KEY_FILENAME" ]; then
            cp "/home/$USERNAME/$OPENVPN_KEY_FILENAME" "/etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}"
        fi
    done

    function_check backup_directory_to_usb
    backup_directory_to_usb /etc/openvpn/easy-rsa/keys vpn
Bob Mottram's avatar
Bob Mottram committed
    backup_directory_to_usb /etc/stunnel vpnstunnel
Bob Mottram's avatar
Bob Mottram committed
function restore_local_vpn {
    temp_restore_dir=/root/tempvpn
    restore_directory_from_usb $temp_restore_dir vpn
    if [ -d ${temp_restore_dir} ]; then
        cp -r ${temp_restore_dir}/* /etc/openvpn/easy-rsa/keys
Bob Mottram's avatar
Bob Mottram committed
        cp -r ${temp_restore_dir}/${OPENVPN_SERVER_NAME}* /etc/openvpn/
        cp -r ${temp_restore_dir}/dh* /etc/openvpn/
        rm -rf ${temp_restore_dir}

        for d in /home/*/ ; do
            USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
Bob Mottram's avatar
Bob Mottram committed
            if [ -f "/etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}" ]; then
                cp "/etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}" "/home/$USERNAME/$OPENVPN_KEY_FILENAME"
                chown "$USERNAME":"$USERNAME" "/home/$USERNAME/$OPENVPN_KEY_FILENAME"
Bob Mottram's avatar
Bob Mottram committed
    temp_restore_dir=/root/tempvpnstunnel
    restore_directory_from_usb $temp_restore_dir vpnstunnel
    if [ -d ${temp_restore_dir} ]; then
        cp -r ${temp_restore_dir}/* /etc/stunnel
        rm -rf ${temp_restore_dir}
        for d in /home/*/ ; do
            USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
Bob Mottram's avatar
Bob Mottram committed
            if [ -f "/home/$USERNAME/stunnel.pem" ]; then
                cp /etc/stunnel/stunnel.pem "/home/$USERNAME/stunnel.pem"
                chown "$USERNAME":"$USERNAME" "/home/$USERNAME/stunnel.pem"
Bob Mottram's avatar
Bob Mottram committed
            if [ -f "/home/$USERNAME/stunnel.p12" ]; then
                cp /etc/stunnel/stunnel.p12 "/home/$USERNAME/stunnel.p12"
                chown "$USERNAME":"$USERNAME" "/home/$USERNAME/stunnel.p12"
Bob Mottram's avatar
Bob Mottram committed
function backup_remote_vpn {
    echo -n ''
Bob Mottram's avatar
Bob Mottram committed
function restore_remote_vpn {
    echo -n ''
Bob Mottram's avatar
Bob Mottram committed
function remove_vpn {
Bob Mottram's avatar
Bob Mottram committed
    systemctl stop stunnel
    systemctl disable stunnel
    rm /etc/systemd/system/stunnel.service

Bob Mottram's avatar
Bob Mottram committed
    systemctl stop openvpn
Bob Mottram's avatar
Bob Mottram committed
    if [ "$VPN_TLS_PORT" -ne 443 ]; then
        firewall_remove VPN-TLS "$VPN_TLS_PORT"
    else
        systemctl enable nginx
        systemctl restart nginx
    $REMOVE_PACKAGES_PURGE fastd openvpn easy-rsa
    $REMOVE_PACKAGES stunnel4
Bob Mottram's avatar
Bob Mottram committed
    if [ -d /etc/openvpn ]; then
        rm -rf /etc/openvpn
    fi
Bob Mottram's avatar
Bob Mottram committed
    firewall_disable_vpn

    echo 0 > /proc/sys/net/ipv4/ip_forward
    sed -i 's|net.ipv4.ip_forward=.*|net.ipv4.ip_forward=0|g' /etc/sysctl.conf

Bob Mottram's avatar
Bob Mottram committed
    remove_completion_param install_vpn
Bob Mottram's avatar
Bob Mottram committed

    # remove any client keys
    for d in /home/*/ ; do
        USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
Bob Mottram's avatar
Bob Mottram committed
        if [ -f "/home/$USERNAME/$OPENVPN_KEY_FILENAME" ]; then
Bob Mottram's avatar
Bob Mottram committed
            rm "/home/$USERNAME/$OPENVPN_KEY_FILENAME"
Bob Mottram's avatar
Bob Mottram committed
        fi
Bob Mottram's avatar
Bob Mottram committed
        rm "/home/$USERNAME/stunnel*"
Bob Mottram's avatar
Bob Mottram committed
    done
Bob Mottram's avatar
Bob Mottram committed
    userdel -f vpn
    groupdel -f vpn
Bob Mottram's avatar
Bob Mottram committed

    if [ -d /etc/stunnel ]; then
        rm -rf /etc/stunnel
    fi
Bob Mottram's avatar
Bob Mottram committed
function create_user_vpn_key {
    username=$1

Bob Mottram's avatar
Bob Mottram committed
    if [ ! -d "/home/$username" ]; then
Bob Mottram's avatar
Bob Mottram committed
        return
    fi

    echo $"Creating VPN key for $username"

    cd /etc/openvpn/easy-rsa || exit 47
Bob Mottram's avatar
Bob Mottram committed
    if [ -f "/etc/openvpn/easy-rsa/keys/$username.crt" ]; then
        rm "/etc/openvpn/easy-rsa/keys/$username.crt"
Bob Mottram's avatar
Bob Mottram committed
    if [ -f "/etc/openvpn/easy-rsa/keys/$username.key" ]; then
        rm "/etc/openvpn/easy-rsa/keys/$username.key"
Bob Mottram's avatar
Bob Mottram committed
    if [ -f "/etc/openvpn/easy-rsa/keys/$username.csr" ]; then
        rm "/etc/openvpn/easy-rsa/keys/$username.csr"
    sed -i 's| --interact||g' build-key
    ./build-key "$username"
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
    if [ ! -f "/etc/openvpn/easy-rsa/keys/$username.crt" ]; then
Bob Mottram's avatar
Bob Mottram committed
        echo $'VPN user cert not generated'
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
    user_cert=$(cat "/etc/openvpn/easy-rsa/keys/$username.crt")
Bob Mottram's avatar
Bob Mottram committed
    if [ ${#user_cert} -lt 10 ]; then
Bob Mottram's avatar
Bob Mottram committed
        cat "/etc/openvpn/easy-rsa/keys/$username.crt"
Bob Mottram's avatar
Bob Mottram committed
        echo $'User cert generation failed'
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
    if [ ! -f "/etc/openvpn/easy-rsa/keys/$username.key" ]; then
Bob Mottram's avatar
Bob Mottram committed
        echo $'VPN user key not generated'
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
    user_key=$(cat "/etc/openvpn/easy-rsa/keys/$username.key")
Bob Mottram's avatar
Bob Mottram committed
    if [ ${#user_key} -lt 10 ]; then
Bob Mottram's avatar
Bob Mottram committed
        cat "/etc/openvpn/easy-rsa/keys/$username.key"
Bob Mottram's avatar
Bob Mottram committed
        echo $'User key generation failed'
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
    user_vpn_cert_file=/home/$username/$OPENVPN_KEY_FILENAME
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
    { echo 'client';
      echo 'dev tun';
      echo 'proto tcp';
      echo "remote localhost $STUNNEL_PORT";
      echo "route $DEFAULT_DOMAIN_NAME 255.255.255.255 net_gateway";
      echo 'resolv-retry infinite';
      echo 'nobind';
      echo 'tun-mtu 1500';
      echo 'tun-mtu-extra 32';
      echo 'mssfix 1450';
      echo 'persist-key';
      echo 'persist-tun';
      echo 'auth-nocache';
      echo 'remote-cert-tls server';
      echo 'comp-lzo';
      echo 'verb 3';
      echo ''; } > "$user_vpn_cert_file"

    {
        echo '<ca>';
        cat /etc/openvpn/ca.crt;
        echo '</ca>';

        echo '<cert>';
        cat "/etc/openvpn/easy-rsa/keys/$username.crt;"
        echo '</cert>';

        echo '<key>';
        cat "/etc/openvpn/easy-rsa/keys/$username.key;"
        echo '</key>'; } >> "$user_vpn_cert_file"

    chown "$username":"$username" "$user_vpn_cert_file"
Bob Mottram's avatar
Bob Mottram committed

    # keep a backup
Bob Mottram's avatar
Bob Mottram committed
    cp "$user_vpn_cert_file" "/etc/openvpn/easy-rsa/keys/$username.ovpn"
Bob Mottram's avatar
Bob Mottram committed
    #rm /etc/openvpn/easy-rsa/keys/$username.crt
    #rm /etc/openvpn/easy-rsa/keys/$username.csr
Bob Mottram's avatar
Bob Mottram committed
    rm "/etc/openvpn/easy-rsa/keys/$username.key"
Bob Mottram's avatar
Bob Mottram committed

    echo $"VPN key created at $user_vpn_cert_file"
}

function add_user_vpn {
    new_username="$1"
Bob Mottram's avatar
Bob Mottram committed
#    new_user_password="$2"
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
    create_user_vpn_key "$new_username"
Bob Mottram's avatar
Bob Mottram committed
    if [ -f /etc/stunnel/stunnel.pem ]; then
Bob Mottram's avatar
Bob Mottram committed
        cp /etc/stunnel/stunnel.pem "/home/$new_username/stunnel.pem"
        chown "$new_username":"$new_username" "/home/$new_username/stunnel.pem"
Bob Mottram's avatar
Bob Mottram committed
    fi
    if [ -f /etc/stunnel/stunnel.p12 ]; then
Bob Mottram's avatar
Bob Mottram committed
        cp /etc/stunnel/stunnel.p12 "/home/$new_username/stunnel.p12"
        chown "$new_username":"$new_username" "/home/$new_username/stunnel.p12"
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
    cp /etc/stunnel/stunnel-client.conf "/home/$new_username/stunnel-client.conf"
    chown "$new_username":"$new_username" "/home/$new_username/stunnel-client.conf"
Bob Mottram's avatar
Bob Mottram committed
}

function remove_user_vpn {
    new_username="$1"
}

Bob Mottram's avatar
Bob Mottram committed
function mesh_setup_vpn {
    vpn_generate_keys

Bob Mottram's avatar
Bob Mottram committed
    if [ -d /home/fbone ]; then
        cp /etc/stunnel/stunnel-client.conf /home/fbone/stunnel-client.conf
        chown fbone:fbone /home/fbone/stunnel*
Bob Mottram's avatar
Bob Mottram committed
    fi

    generate_stunnel_keys

    systemctl restart openvpn
}

Bob Mottram's avatar
Bob Mottram committed
function generate_stunnel_keys {
Bob Mottram's avatar
Bob Mottram committed
    openssl req -x509 -nodes -days 3650 -sha256 \
            -subj "/O=$VPN_ORGANISATION/OU=$VPN_UNIT/C=$VPN_COUNTRY_CODE/ST=$VPN_AREA/L=$VPN_LOCATION/CN=$HOSTNAME" \
Bob Mottram's avatar
Bob Mottram committed
            -newkey rsa:2048 -keyout /etc/stunnel/key.pem \
            -out /etc/stunnel/cert.pem
    if [ ! -f /etc/stunnel/key.pem ]; then
Bob Mottram's avatar
Bob Mottram committed
        echo $'stunnel key not created'
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
    if [ ! -f /etc/stunnel/cert.pem ]; then
Bob Mottram's avatar
Bob Mottram committed
        echo $'stunnel cert not created'
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
    chmod 400 /etc/stunnel/key.pem
    chmod 640 /etc/stunnel/cert.pem
Bob Mottram's avatar
Bob Mottram committed
    cat /etc/stunnel/key.pem /etc/stunnel/cert.pem >> /etc/stunnel/stunnel.pem
    chmod 640 /etc/stunnel/stunnel.pem
Bob Mottram's avatar
Bob Mottram committed
    openssl pkcs12 -export -out /etc/stunnel/stunnel.p12 -inkey /etc/stunnel/key.pem -in /etc/stunnel/cert.pem -passout pass:
    if [ ! -f /etc/stunnel/stunnel.p12 ]; then
Bob Mottram's avatar
Bob Mottram committed
        echo $'stunnel pkcs12 not created'
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
    chmod 640 /etc/stunnel/stunnel.p12
Bob Mottram's avatar
Bob Mottram committed
    cp /etc/stunnel/stunnel.pem "/home/$MY_USERNAME/stunnel.pem"
    cp /etc/stunnel/stunnel.p12 "/home/$MY_USERNAME/stunnel.p12"
    chown "$MY_USERNAME":"$MY_USERNAME" "$prefix/home/$MY_USERNAME/stunnel*"
Bob Mottram's avatar
Bob Mottram committed
}
Bob Mottram's avatar
Bob Mottram committed
function install_stunnel {
    prefix=
    prefixchroot=
Bob Mottram's avatar
Bob Mottram committed
    # shellcheck disable=SC2154
    if [ "$rootdir" ]; then
Bob Mottram's avatar
Bob Mottram committed
        prefix=$rootdir
        prefixchroot="chroot $rootdir"
Bob Mottram's avatar
Bob Mottram committed
        VPN_TLS_PORT=$VPN_MESH_TLS_PORT
    # shellcheck disable=SC2086
    $prefixchroot $INSTALL_PACKAGES stunnel4
Bob Mottram's avatar
Bob Mottram committed
    if [ ! "$prefix" ]; then
        cd /etc/stunnel || exit 46
Bob Mottram's avatar
Bob Mottram committed
        generate_stunnel_keys
    fi
Bob Mottram's avatar
Bob Mottram committed
    { echo 'chroot = /var/lib/stunnel4';
      echo 'pid = /stunnel4.pid';
      echo 'setuid = stunnel4';
      echo 'setgid = stunnel4';
      echo 'socket = l:TCP_NODELAY=1';
      echo 'socket = r:TCP_NODELAY=1';
      echo 'cert = /etc/stunnel/stunnel.pem';
      echo '[openvpn]';
      echo "accept = $VPN_TLS_PORT";
      echo 'connect = localhost:1194';
      echo 'cert = /etc/stunnel/stunnel.pem';
      echo 'protocol = socks'; } > "$prefix/etc/stunnel/stunnel.conf"

    sed -i 's|ENABLED=.*|ENABLED=1|g' "$prefix/etc/default/stunnel4"

    { echo '[openvpn]';
      echo 'client = yes';
      echo "accept = $STUNNEL_PORT";
      echo "connect = $DEFAULT_DOMAIN_NAME:$VPN_TLS_PORT";
      echo 'cert = stunnel.pem';
      echo 'protocol = socks'; } > "$prefix/etc/stunnel/stunnel-client.conf"

    { echo '[Unit]';
      echo 'Description=SSL tunnel for network daemons';
      echo 'Documentation=man:stunnel https://www.stunnel.org/docs.html';
      echo 'DefaultDependencies=no';
      echo 'After=network.target';
      echo 'After=syslog.target';
      echo '';
      echo '[Install]';
      echo 'WantedBy=multi-user.target';
      echo 'Alias=stunnel.target';
      echo '';
      echo '[Service]';
      echo 'Type=forking';
      echo 'RuntimeDirectory=stunnel';
      echo 'EnvironmentFile=-/etc/stunnel/stunnel.conf';
      echo 'ExecStart=/usr/bin/stunnel /etc/stunnel/stunnel.conf';
      echo 'ExecStop=/usr/bin/killall -9 stunnel';
      echo 'RemainAfterExit=yes'; } > "$prefix/etc/systemd/system/stunnel.service"

    if [ ! "$prefix" ]; then
Bob Mottram's avatar
Bob Mottram committed
        if [ $VPN_TLS_PORT -eq 443 ]; then
            systemctl stop nginx
            systemctl disable nginx
        else
            systemctl enable nginx
            systemctl restart nginx
        fi

        systemctl enable stunnel
        systemctl daemon-reload
        systemctl start stunnel
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
        cp /etc/stunnel/stunnel-client.conf "/home/$MY_USERNAME/stunnel-client.conf"
        chown "$MY_USERNAME":"$MY_USERNAME" "/home/$MY_USERNAME/stunnel*"
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
}
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
function vpn_generate_keys {
Bob Mottram's avatar
Bob Mottram committed
    # generate host keys
    if [ ! -f /etc/openvpn/dh2048.pem ]; then
Bob Mottram's avatar
Bob Mottram committed
        "${PROJECT_NAME}-dhparam" -o /etc/openvpn/dh2048.pem
    if [ ! -f /etc/openvpn/dh2048.pem ]; then
        echo $'vpn dhparams were not generated'
    fi
    cp /etc/openvpn/dh2048.pem /etc/openvpn/easy-rsa/keys/dh2048.pem

    cd /etc/openvpn/easy-rsa || exit 56
Bob Mottram's avatar
Bob Mottram committed
    # shellcheck disable=SC1091
Bob Mottram's avatar
Bob Mottram committed
    . ./vars
    ./clean-all
Bob Mottram's avatar
Bob Mottram committed
    vpn_openssl_version='1.0.0'
    if [ ! -f openssl-${vpn_openssl_version}.cnf ]; then
        echo $"openssl-${vpn_openssl_version}.cnf was not found"
Bob Mottram's avatar
Bob Mottram committed
    cp openssl-${vpn_openssl_version}.cnf openssl.cnf

    if [ -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt ]; then
        rm /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt
    fi
    if [ -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.key ]; then
        rm /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.key
    fi
    if [ -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.csr ]; then
        rm /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.csr
    fi
    sed -i 's| --interact||g' build-key-server
    sed -i 's| --interact||g' build-ca
    ./build-ca
Bob Mottram's avatar
Bob Mottram committed
    ./build-key-server ${OPENVPN_SERVER_NAME}
Bob Mottram's avatar
Bob Mottram committed
    if [ ! -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt ]; then
Bob Mottram's avatar
Bob Mottram committed
        echo $'OpenVPN crt not found'
Bob Mottram's avatar
Bob Mottram committed
    fi
Bob Mottram's avatar
Bob Mottram committed
    server_cert=$(cat /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt)
    if [ ${#server_cert} -lt 10 ]; then
        cat /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt
        echo $'Server cert generation failed'
Bob Mottram's avatar
Bob Mottram committed
    fi

    if [ ! -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.key ]; then
Bob Mottram's avatar
Bob Mottram committed
        echo $'OpenVPN key not found'
Bob Mottram's avatar
Bob Mottram committed
    fi
    if [ ! -f /etc/openvpn/easy-rsa/keys/ca.key ]; then
        echo $'OpenVPN ca not found'
Bob Mottram's avatar
Bob Mottram committed
    fi
    cp /etc/openvpn/easy-rsa/keys/{$OPENVPN_SERVER_NAME.crt,$OPENVPN_SERVER_NAME.key,ca.crt} /etc/openvpn

Bob Mottram's avatar
Bob Mottram committed
    create_user_vpn_key "${MY_USERNAME}"
Bob Mottram's avatar
Bob Mottram committed
}
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
function install_vpn {
    prefix=
    prefixchroot=
Bob Mottram's avatar
Bob Mottram committed
    if [ "$rootdir" ]; then
Bob Mottram's avatar
Bob Mottram committed
        prefix=$rootdir
        prefixchroot="chroot $rootdir"
Bob Mottram's avatar
Bob Mottram committed
        VPN_TLS_PORT=$VPN_MESH_TLS_PORT
Bob Mottram's avatar
Bob Mottram committed
    fi
    # shellcheck disable=SC2086
    $prefixchroot $INSTALL_PACKAGES fastd openvpn easy-rsa
Bob Mottram's avatar
Bob Mottram committed
    $prefixchroot groupadd vpn
    $prefixchroot useradd -r -s /bin/false -g vpn vpn

    # server configuration
Bob Mottram's avatar
Bob Mottram committed
    { echo 'port 1194';
      echo 'proto tcp';
      echo 'dev tun';
      echo 'tun-mtu 1500';
      echo 'tun-mtu-extra 32';
      echo 'mssfix 1450';
      echo 'ca /etc/openvpn/ca.crt';
      echo 'cert /etc/openvpn/server.crt';
      echo 'key /etc/openvpn/server.key';
      echo 'dh /etc/openvpn/dh2048.pem';
      echo 'server 10.8.0.0 255.255.255.0';
      echo 'push "redirect-gateway def1 bypass-dhcp"';
Bob Mottram's avatar
Bob Mottram committed
      echo "push \"dhcp-option DNS 91.239.100.100\"";
      echo "push \"dhcp-option DNS 89.233.43.71\"";
Bob Mottram's avatar
Bob Mottram committed
      echo 'keepalive 5 30';
      echo 'comp-lzo';
      echo 'persist-key';
      echo 'persist-tun';
      echo 'status /dev/null';
      echo 'verb 3';
      echo ''; } > "$prefix/etc/openvpn/server.conf"

    if [ ! "$prefix" ]; then
Bob Mottram's avatar
Bob Mottram committed
        echo 1 > /proc/sys/net/ipv4/ip_forward
    fi
Bob Mottram's avatar
Bob Mottram committed
    sed -i 's|# net.ipv4.ip_forward|net.ipv4.ip_forward|g' "$prefix/etc/sysctl.conf"
    sed -i 's|#net.ipv4.ip_forward|net.ipv4.ip_forward|g' "$prefix/etc/sysctl.conf"
    sed -i 's|net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g' "$prefix/etc/sysctl.conf"
Bob Mottram's avatar
Bob Mottram committed
    cp -r "$prefix/usr/share/easy-rsa/" "$prefix/etc/openvpn"
    if [ ! -d "$prefix/etc/openvpn/easy-rsa/keys" ]; then
        mkdir "$prefix/etc/openvpn/easy-rsa/keys"
Bob Mottram's avatar
Bob Mottram committed
    # keys configuration
Bob Mottram's avatar
Bob Mottram committed
    sed -i "s|export KEY_COUNTRY.*|export KEY_COUNTRY=\"US\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
    sed -i "s|export KEY_PROVINCE.*|export KEY_PROVINCE=\"TX\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
    sed -i "s|export KEY_CITY.*|export KEY_CITY=\"Dallas\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
    sed -i "s|export KEY_ORG.*|export KEY_ORG=\"$PROJECT_NAME\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
    sed -i "s|export KEY_EMAIL.*|export KEY_EMAIL=\"$MY_EMAIL_ADDRESS\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
    sed -i "s|export KEY_OU=.*|export KEY_OU=\"MoonUnit\"|g" "$prefix/etc/openvpn/easy-rsa/vars"
    sed -i "s|export KEY_NAME.*|export KEY_NAME=\"$OPENVPN_SERVER_NAME\"|g" "$prefix/etc/openvpn/easy-rsa/vars"

    if [ ! "$prefix" ]; then
Bob Mottram's avatar
Bob Mottram committed
        vpn_generate_keys
        firewall_enable_vpn

        if [ ${VPN_TLS_PORT} -ne 443 ]; then
            firewall_add VPN-TLS ${VPN_TLS_PORT} tcp
        fi

        systemctl start openvpn
    fi
Bob Mottram's avatar
Bob Mottram committed

Bob Mottram's avatar
Bob Mottram committed
    install_stunnel

Bob Mottram's avatar
Bob Mottram committed
    if [ ! "$prefix" ]; then
Bob Mottram's avatar
Bob Mottram committed
        systemctl restart openvpn
    fi
Bob Mottram's avatar
Bob Mottram committed
}

# NOTE: deliberately there is no "exit 0"