diff --git a/openvpn-install.sh b/openvpn-install.sh
index ed7d55e..04d9729 100644
--- a/openvpn-install.sh
+++ b/openvpn-install.sh
@@ -30,58 +30,21 @@ file_client_tpl="${dir_openvpn}/client-template.txt"
file_openvpn_conf="${dir_openvpn}/server.conf"
file_iptables='/etc/iptables/iptables.rules'
-## function determine the operating system version
-detect_os_ver(){
-
-if [[ -e /etc/debian_version ]]; then
- OS="debian"
- # Getting the version number, to verify that a recent version of OpenVPN is available
- VERSION_ID=$(cat /etc/os-release | grep "VERSION_ID")
- SYSCTL='/etc/sysctl.conf'
- if [[ "$VERSION_ID" != 'VERSION_ID="7"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="8"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="9"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="12.04"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="14.04"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="16.04"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="16.10"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="17.04"' ]]; then
- echo 'Your version of Debian/Ubuntu is not supported.'
- echo "I can't install a recent version of OpenVPN on your system."
- echo ''
- echo "However, if you're using Debian unstable/testing, or Ubuntu beta,"
- echo 'then you can continue, a recent version of OpenVPN is available on these.'
- echo 'Keep in mind they are not supported, though.'
- while [[ "$CONTINUE" != [yn] ]]; do
- read -p 'Continue ? [y/n]: ' -e CONTINUE
- done
- if [[ 'n' = "$CONTINUE" ]]; then
- echo 'Ok, bye !'
- exit 4
- fi
- fi
-elif [[ -e /etc/centos-release || -e /etc/redhat-release && ! -e /etc/fedora-release ]]; then
- OS='centos'
- SYSCTL='/etc/sysctl.conf'
-elif [[ -e /etc/arch-release ]]; then
- OS='arch'
- SYSCTL='/etc/sysctl.d/openvpn.conf'
-elif [[ -e /etc/fedora-release ]]; then
- OS='fedora'
- SYSCTL='/etc/sysctl.d/openvpn.conf'
-else
- echo "Looks like you aren't running this installer on a Debian, Ubuntu, CentOS or ArchLinux system"
- exit 4
-fi
-}
-
install_easyrsa(){
- # An old version of easy-rsa was available by default in some openvpn packages
- if [[ -d ${dir_easy}/ ]]; then
- rm -rf ${dir_easy}/
- fi
- # Get easy-rsa
- url_easy='https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz'
- file_easy=${url_easy##*/}
- wget -O ~/${file_easy} ${url_easy}
- tar xzf ~/${file_easy} -C ~/
- mv ~/${file_easy%.tgz} ${dir_easy}
- chown -R root:root ${dir_easy}/
- rm -rf ~/${file_easy}
+
+# An old version of easy-rsa was available by default in some openvpn packages
+if [[ -d ${dir_easy}/ ]]; then
+ rm -rf ${dir_easy}/
+fi
+# Get easy-rsa
+url_easy='https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz'
+file_easy=${url_easy##*/}
+wget -O ~/${file_easy} ${url_easy}
+tar xzf ~/${file_easy} -C ~/
+mv ~/${file_easy%.tgz} ${dir_easy}
+chown -R root:root ${dir_easy}/
+rm -rf ~/${file_easy}
}
set_firewall(){
@@ -134,37 +97,39 @@ set_firewall(){
fi
}
-newclient () {
- # Where to write the custom client.ovpn?
- if [ -e /home/$1 ]; then # if $1 is a user name
- homeDir="/home/$1"
- elif [ ${SUDO_USER} ]; then # if not, use SUDO_USER
- homeDir="/home/${SUDO_USER}"
- else # if not SUDO_USER, use /root
- homeDir="${dir_openvpn}"
- fi
- # Generates the custom client.ovpn
- file_client="$homeDir/$1.ovpn"
- cp ${file_client_tpl} ${file_client}
- echo "" >> ${file_client}
- cat ${dir_easy}/pki/ca.crt >> ${file_client}
- echo "" >> ${file_client}
- echo "" >> ${file_client}
- cat ${dir_easy}/pki/issued/$1.crt >> ${file_client}
- echo "" >> ${file_client}
- echo "" >> ${file_client}
- cat ${dir_easy}/pki/private/$1.key >> ${file_client}
- echo "" >> ${file_client}
- echo "key-direction 1" >> ${file_client}
- echo "" >> ${file_client}
- cat ${dir_openvpn}/tls-auth.key >> ${file_client}
- echo "" >> ${file_client}
+generate_newclient() {
+
+# Where to write the custom client.ovpn?
+if [ -e /home/$1 ]; then # if $1 is a user name
+ homeDir="/home/$1"
+elif [ ${SUDO_USER} ]; then # if not, use SUDO_USER
+ homeDir="/home/${SUDO_USER}"
+else # if not SUDO_USER, use /root
+ homeDir="${dir_openvpn}"
+fi
+# Generates the custom client.ovpn
+file_client="$homeDir/$1.ovpn"
+cp ${file_client_tpl} ${file_client}
+echo "" >> ${file_client}
+cat ${dir_easy}/pki/ca.crt >> ${file_client}
+echo "" >> ${file_client}
+echo "" >> ${file_client}
+cat ${dir_easy}/pki/issued/$1.crt >> ${file_client}
+echo "" >> ${file_client}
+echo "" >> ${file_client}
+cat ${dir_easy}/pki/private/$1.key >> ${file_client}
+echo "" >> ${file_client}
+echo "key-direction 1" >> ${file_client}
+echo "" >> ${file_client}
+cat ${dir_openvpn}/tls-auth.key >> ${file_client}
+echo "" >> ${file_client}
}
## function for install openvpn server
install_openvpn(){
- clear
+
+clear
cat < /etc/apt/sources.list.d/openvpn.list
- wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg | apt-key add -
- ${bin_apt} update
- # Ubuntu >= 16.04 and Debian > 8 have OpenVPN > 2.3.3 without the need of a third party repository.
-
- ## The we install OpenVPN
- apt-get install openvpn iptables openssl wget ca-certificates curl -y
- # Install iptables service
- if [[ ! -e /etc/systemd/system/iptables.service ]]; then
- mkdir /etc/iptables
- iptables-save > ${file_iptables}
- echo "#!/bin/sh
-iptables -F
-iptables -X
-iptables -t nat -F
-iptables -t nat -X
-iptables -t mangle -F
-iptables -t mangle -X
-iptables -P INPUT ACCEPT
-iptables -P FORWARD ACCEPT
-iptables -P OUTPUT ACCEPT" > /etc/iptables/flush-iptables.sh
- chmod +x /etc/iptables/flush-iptables.sh
- echo "[Unit]
-Description=Packet Filtering Framework
-DefaultDependencies=no
-Before=network-pre.target
-Wants=network-pre.target
-[Service]
-Type=oneshot
-ExecStart=/sbin/iptables-restore ${file_iptables}
-ExecReload=/sbin/iptables-restore ${file_iptables}
-ExecStop=/etc/iptables/flush-iptables.sh
-RemainAfterExit=yes
-[Install]
-WantedBy=multi-user.target" > /etc/systemd/system/iptables.service
- systemctl daemon-reload
- systemctl enable iptables.service
- fi
- elif [[ "$OS" = 'centos' || "$OS" = 'fedora' ]]; then
- if [[ "$OS" = 'centos' ]]; then
- yum install epel-release -y
- fi
- yum install openvpn iptables openssl wget ca-certificates curl -y
- # Install iptables service
- if [[ ! -e /etc/systemd/system/iptables.service ]]; then
- mkdir /etc/iptables
- iptables-save > ${file_iptables}
- echo "#!/bin/sh
-iptables -F
-iptables -X
-iptables -t nat -F
-iptables -t nat -X
-iptables -t mangle -F
-iptables -t mangle -X
-iptables -P INPUT ACCEPT
-iptables -P FORWARD ACCEPT
-iptables -P OUTPUT ACCEPT" > /etc/iptables/flush-iptables.sh
- chmod +x /etc/iptables/flush-iptables.sh
- echo "[Unit]
-Description=Packet Filtering Framework
-DefaultDependencies=no
-Before=network-pre.target
-Wants=network-pre.target
-[Service]
-Type=oneshot
-ExecStart=/sbin/iptables-restore ${file_iptables}
-ExecReload=/sbin/iptables-restore ${file_iptables}
-ExecStop=/etc/iptables/flush-iptables.sh
-RemainAfterExit=yes
-[Install]
-WantedBy=multi-user.target" > /etc/systemd/system/iptables.service
- systemctl daemon-reload
- systemctl enable iptables.service
- # Disable firewalld to allow iptables to start upon reboot
- systemctl disable firewalld
- systemctl mask firewalld
- fi
- else
- # Else, the distro is ArchLinux
- echo ""
- echo ""
- echo "As you're using ArchLinux, I need to update the packages on your system to install those I need."
- echo "Not doing that could cause problems between dependencies, or missing files in repositories."
- echo ""
- echo "Continuing will update your installed packages and install needed ones."
- while [[ $CONTINUE != [yn] ]]; do
- read -p "Continue ? [y/n]: " -e -i y CONTINUE
- done
- if [[ "$CONTINUE" = "n" ]]; then
- echo "Ok, bye !"
- exit 4
- fi
+echo ""
+echo "4/6.Choose what size of Diffie-Hellman key you want to use:"
+echo " 1) 2048 bits (fastest)"
+echo " 2) 3072 bits (recommended, best compromise)"
+echo " 3) 4096 bits (most secure)"
+while [[ $DH_KEY_SIZE != [1-3] ]]; do
+ read -p "DH key size [1-3]: " -e -i 2 DH_KEY_SIZE
+done
+case $DH_KEY_SIZE in
+ 1)
+ DH_KEY_SIZE="2048"
+ ;;
+ 2)
+ DH_KEY_SIZE="3072"
+ ;;
+ 3)
+ DH_KEY_SIZE="4096"
+ ;;
+esac
- if [[ "$OS" = 'arch' ]]; then
- # Install dependencies
- pacman -Syu openvpn iptables openssl wget ca-certificates curl --needed --noconfirm
- iptables-save > ${file_iptables} # iptables won't start if this file does not exist
- systemctl daemon-reload
- systemctl enable iptables
- systemctl start iptables
- fi
+echo ""
+echo "5/6.Choose what size of RSA key you want to use:"
+echo " 1) 2048 bits (fastest)"
+echo " 2) 3072 bits (recommended, best compromise)"
+echo " 3) 4096 bits (most secure)"
+while [[ $RSA_KEY_SIZE != [1-3] ]]; do
+ read -p "RSA key size [1-3]: " -e -i 2 RSA_KEY_SIZE
+done
+case $RSA_KEY_SIZE in
+ 1)
+ RSA_KEY_SIZE="2048"
+ ;;
+ 2)
+ RSA_KEY_SIZE="3072"
+ ;;
+ 3)
+ RSA_KEY_SIZE="4096"
+ ;;
+esac
+
+echo ""
+echo "6/6.Finally, tell me a name for the client certificate and configuration"
+while [[ $CLIENT = "" ]]; do
+ echo "Please, use one word only, no special characters"
+ read -p "Client name: " -e -i client CLIENT
+done
+
+echo ""
+echo "Okay, that was all I needed. We are ready to setup your OpenVPN server now"
+read -n1 -r -p "Press any key to continue..."
+
+if [[ "$OS" = 'debian' ]]; then
+ apt-get install ca-certificates -y
+ # We add the OpenVPN repo to get the latest version.
+ # Debian 7
+ if [[ "$VERSION_ID" = 'VERSION_ID="7"' ]]; then
+ os_vername=wheezy
+ bin_apt=apt-get
fi
- # Find out if the machine uses nogroup or nobody for the permissionless group
- if grep -qs "^nogroup:" /etc/group; then
- NOGROUP=nogroup
- else
- NOGROUP=nobody
+ # Debian 8
+ if [[ "$VERSION_ID" = 'VERSION_ID="8"' ]]; then
+ os_vername=jessie
+ bin_apt=apt
fi
- ## function install_easyrsa
- install_easyrsa
+ # Ubuntu 12.04
+ if [[ "$VERSION_ID" = 'VERSION_ID="12.04"' ]]; then
+ os_vername=precise
+ bin_apt=apt-get
+ fi
+ # Ubuntu 14.04
+ if [[ "$VERSION_ID" = 'VERSION_ID="14.04"' ]]; then
+ os_vername=trusty
+ bin_apt=apt-get
+ fi
+ echo "deb http://build.openvpn.net/debian/openvpn/stable ${os_vername} main" > /etc/apt/sources.list.d/openvpn.list
+ wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg | apt-key add -
+ ${bin_apt} update
+ # Ubuntu >= 16.04 and Debian > 8 have OpenVPN > 2.3.3 without the need of a third party repository.
- cd ${dir_easy}/
- echo "set_var EASYRSA_KEY_SIZE $RSA_KEY_SIZE" > vars
- # Create the PKI, set up the CA, the DH params and the server + client certificates
- ./easyrsa init-pki
- ./easyrsa --batch build-ca nopass
- openssl dhparam -out dh.pem $DH_KEY_SIZE
- ./easyrsa build-server-full server nopass
- ./easyrsa build-client-full $CLIENT nopass
- EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
- # generate tls-auth key
- openvpn --genkey --secret /etc/openvpn/tls-auth.key
- # Move all the generated files
- cp pki/ca.crt pki/private/ca.key dh.pem pki/issued/server.crt pki/private/server.key ${dir_easy}/pki/crl.pem /etc/openvpn/
- # Make cert revocation list readable for non-root
- chmod 644 /etc/openvpn/crl.pem
+ ## The we install OpenVPN
+ apt-get install openvpn iptables openssl wget ca-certificates curl -y
+ # Install iptables service
+ if [[ ! -e /etc/systemd/system/iptables.service ]]; then
+ mkdir /etc/iptables
+ iptables-save > ${file_iptables}
+ echo "#!/bin/sh
+iptables -F
+iptables -X
+iptables -t nat -F
+iptables -t nat -X
+iptables -t mangle -F
+iptables -t mangle -X
+iptables -P INPUT ACCEPT
+iptables -P FORWARD ACCEPT
+iptables -P OUTPUT ACCEPT" > /etc/iptables/flush-iptables.sh
+ chmod +x /etc/iptables/flush-iptables.sh
+ echo "[Unit]
+Description=Packet Filtering Framework
+DefaultDependencies=no
+Before=network-pre.target
+Wants=network-pre.target
+[Service]
+Type=oneshot
+ExecStart=/sbin/iptables-restore ${file_iptables}
+ExecReload=/sbin/iptables-restore ${file_iptables}
+ExecStop=/etc/iptables/flush-iptables.sh
+RemainAfterExit=yes
+[Install]
+WantedBy=multi-user.target" > /etc/systemd/system/iptables.service
+ systemctl daemon-reload
+ systemctl enable iptables.service
+ fi
+elif [[ "$OS" = 'centos' || "$OS" = 'fedora' ]]; then
+ if [[ "$OS" = 'centos' ]]; then
+ yum install epel-release -y
+ fi
+ yum install openvpn iptables openssl wget ca-certificates curl -y
+ # Install iptables service
+ if [[ ! -e /etc/systemd/system/iptables.service ]]; then
+ mkdir /etc/iptables
+ iptables-save > ${file_iptables}
+ echo "#!/bin/sh
+iptables -F
+iptables -X
+iptables -t nat -F
+iptables -t nat -X
+iptables -t mangle -F
+iptables -t mangle -X
+iptables -P INPUT ACCEPT
+iptables -P FORWARD ACCEPT
+iptables -P OUTPUT ACCEPT" > /etc/iptables/flush-iptables.sh
+ chmod +x /etc/iptables/flush-iptables.sh
+ echo "[Unit]
+Description=Packet Filtering Framework
+DefaultDependencies=no
+Before=network-pre.target
+Wants=network-pre.target
+[Service]
+Type=oneshot
+ExecStart=/sbin/iptables-restore ${file_iptables}
+ExecReload=/sbin/iptables-restore ${file_iptables}
+ExecStop=/etc/iptables/flush-iptables.sh
+RemainAfterExit=yes
+[Install]
+WantedBy=multi-user.target" > /etc/systemd/system/iptables.service
+ systemctl daemon-reload
+ systemctl enable iptables.service
+ # Disable firewalld to allow iptables to start upon reboot
+ systemctl disable firewalld
+ systemctl mask firewalld
+ fi
+else
+ # Else, the distro is ArchLinux
+ echo ""
+ echo ""
+ echo "As you're using ArchLinux, I need to update the packages on your system to install those I need."
+ echo "Not doing that could cause problems between dependencies, or missing files in repositories."
+ echo ""
+ echo "Continuing will update your installed packages and install needed ones."
+ while [[ $CONTINUE != [yn] ]]; do
+ read -p "Continue ? [y/n]: " -e -i y CONTINUE
+ done
+ if [[ "$CONTINUE" = "n" ]]; then
+ echo "Ok, bye !"
+ exit 4
+ fi
- # Generate server.conf
- echo "port $PORT
+ if [[ "$OS" = 'arch' ]]; then
+ # Install dependencies
+ pacman -Syu openvpn iptables openssl wget ca-certificates curl --needed --noconfirm
+ iptables-save > ${file_iptables} # iptables won't start if this file does not exist
+ systemctl daemon-reload
+ systemctl enable iptables
+ systemctl start iptables
+ fi
+fi
+
+# Find out if the machine uses nogroup or nobody for the permissionless group
+if grep -qs "^nogroup:" /etc/group; then
+ NOGROUP=nogroup
+else
+ NOGROUP=nobody
+fi
+## function install_easyrsa
+install_easyrsa
+
+cd ${dir_easy}/
+echo "set_var EASYRSA_KEY_SIZE $RSA_KEY_SIZE" > vars
+# Create the PKI, set up the CA, the DH params and the server + client certificates
+./easyrsa init-pki
+./easyrsa --batch build-ca nopass
+openssl dhparam -out dh.pem $DH_KEY_SIZE
+./easyrsa build-server-full server nopass
+./easyrsa build-client-full $CLIENT nopass
+EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
+# generate tls-auth key
+openvpn --genkey --secret /etc/openvpn/tls-auth.key
+# Move all the generated files
+cp pki/ca.crt pki/private/ca.key dh.pem pki/issued/server.crt pki/private/server.key ${dir_easy}/pki/crl.pem /etc/openvpn/
+# Make cert revocation list readable for non-root
+chmod 644 /etc/openvpn/crl.pem
+
+# Generate server.conf
+echo "port $PORT
proto ${PROTOCOL}
dev tun
user nobody
@@ -454,42 +426,42 @@ keepalive 10 120
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt" >> /etc/openvpn/server.conf
- # DNS resolvers
- case $DNS in
- 1)
- # Obtain the resolvers from resolv.conf and use them for OpenVPN
- grep -v '#' /etc/resolv.conf | grep 'nameserver' | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | while read line; do
- echo "push \"dhcp-option DNS $line\""
- done
- ;;
- 2) #Quad9
- echo 'push "dhcp-option DNS 9.9.9.9"'
- ;;
- 3) #FDN
- echo 'push "dhcp-option DNS 80.67.169.12"'
- echo 'push "dhcp-option DNS 80.67.169.40"'
- ;;
- 4) #DNS.WATCH
- echo 'push "dhcp-option DNS 84.200.69.80"'
- echo 'push "dhcp-option DNS 84.200.70.40"'
- ;;
- 5) #OpenDNS
- echo 'push "dhcp-option DNS 208.67.222.222"'
- echo 'push "dhcp-option DNS 208.67.220.220"'
- ;;
- 6) #Google
- echo 'push "dhcp-option DNS 8.8.8.8"'
- echo 'push "dhcp-option DNS 8.8.4.4"'
- ;;
- 7) #Yandex Basic
- echo 'push "dhcp-option DNS 77.88.8.8"'
- echo 'push "dhcp-option DNS 77.88.8.1"'
- ;;
- 8) #AdGuard DNS
- echo 'push "dhcp-option DNS 176.103.130.130"'
- echo 'push "dhcp-option DNS 176.103.130.131"'
- ;;
- esac >> /etc/openvpn/server.conf
+# DNS resolvers
+case $DNS in
+ 1)
+ # Obtain the resolvers from resolv.conf and use them for OpenVPN
+ grep -v '#' /etc/resolv.conf | grep 'nameserver' | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | while read line; do
+ echo "push \"dhcp-option DNS $line\""
+ done
+ ;;
+ 2) #Quad9
+ echo 'push "dhcp-option DNS 9.9.9.9"'
+ ;;
+ 3) #FDN
+ echo 'push "dhcp-option DNS 80.67.169.12"'
+ echo 'push "dhcp-option DNS 80.67.169.40"'
+ ;;
+ 4) #DNS.WATCH
+ echo 'push "dhcp-option DNS 84.200.69.80"'
+ echo 'push "dhcp-option DNS 84.200.70.40"'
+ ;;
+ 5) #OpenDNS
+ echo 'push "dhcp-option DNS 208.67.222.222"'
+ echo 'push "dhcp-option DNS 208.67.220.220"'
+ ;;
+ 6) #Google
+ echo 'push "dhcp-option DNS 8.8.8.8"'
+ echo 'push "dhcp-option DNS 8.8.4.4"'
+ ;;
+ 7) #Yandex Basic
+ echo 'push "dhcp-option DNS 77.88.8.8"'
+ echo 'push "dhcp-option DNS 77.88.8.1"'
+ ;;
+ 8) #AdGuard DNS
+ echo 'push "dhcp-option DNS 176.103.130.130"'
+ echo 'push "dhcp-option DNS 176.103.130.131"'
+ ;;
+esac >> /etc/openvpn/server.conf
echo 'push "redirect-gateway def1 bypass-dhcp" '>> /etc/openvpn/server.conf
echo "crl-verify crl.pem
ca ca.crt
@@ -505,64 +477,64 @@ tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
status openvpn.log
verb 3" >> /etc/openvpn/server.conf
- ## function set_firewall
- set_firewall
+## call function set_firewall
+set_firewall
- # And finally, restart OpenVPN
- if [[ "$OS" = 'debian' ]]; then
- # Little hack to check for systemd
- if pgrep systemd-journal; then
- #Workaround to fix OpenVPN service on OpenVZ
- sed -i 's|LimitNPROC|#LimitNPROC|' /lib/systemd/system/openvpn\@.service
- sed -i 's|/etc/openvpn/server|/etc/openvpn|' /lib/systemd/system/openvpn\@.service
- sed -i 's|%i.conf|server.conf|' /lib/systemd/system/openvpn\@.service
- systemctl daemon-reload
- systemctl restart openvpn
- systemctl enable openvpn
+# And finally, restart OpenVPN
+if [[ "$OS" = 'debian' ]]; then
+ # Little hack to check for systemd
+ if pgrep systemd-journal; then
+ #Workaround to fix OpenVPN service on OpenVZ
+ sed -i 's|LimitNPROC|#LimitNPROC|' /lib/systemd/system/openvpn\@.service
+ sed -i 's|/etc/openvpn/server|/etc/openvpn|' /lib/systemd/system/openvpn\@.service
+ sed -i 's|%i.conf|server.conf|' /lib/systemd/system/openvpn\@.service
+ systemctl daemon-reload
+ systemctl restart openvpn
+ systemctl enable openvpn
+ else
+ /etc/init.d/openvpn restart
+ fi
+else
+ if pgrep systemd-journal; then
+ if [[ "$OS" = 'arch' || "$OS" = 'fedora' ]]; then
+ #Workaround to avoid rewriting the entire script for Arch & Fedora
+ sed -i 's|/etc/openvpn/server|/etc/openvpn|' /usr/lib/systemd/system/openvpn-server@.service
+ sed -i 's|%i.conf|server.conf|' /usr/lib/systemd/system/openvpn-server@.service
+ systemctl daemon-reload
+ systemctl restart openvpn-server@openvpn.service
+ systemctl enable openvpn-server@openvpn.service
else
- /etc/init.d/openvpn restart
+ systemctl restart openvpn@server.service
+ systemctl enable openvpn@server.service
fi
else
- if pgrep systemd-journal; then
- if [[ "$OS" = 'arch' || "$OS" = 'fedora' ]]; then
- #Workaround to avoid rewriting the entire script for Arch & Fedora
- sed -i 's|/etc/openvpn/server|/etc/openvpn|' /usr/lib/systemd/system/openvpn-server@.service
- sed -i 's|%i.conf|server.conf|' /usr/lib/systemd/system/openvpn-server@.service
- systemctl daemon-reload
- systemctl restart openvpn-server@openvpn.service
- systemctl enable openvpn-server@openvpn.service
- else
- systemctl restart openvpn@server.service
- systemctl enable openvpn@server.service
- fi
- else
- service openvpn restart
- chkconfig openvpn on
- fi
+ service openvpn restart
+ chkconfig openvpn on
fi
- # Try to detect a NATed connection and ask about it to potential LowEndSpirit/Scaleway users
- EXTERNALIP=$(wget -qO- ipv4.icanhazip.com)
- if [[ "$IP" != "$EXTERNALIP" ]]; then
- echo ""
- echo "Looks like your server is behind a NAT!"
- echo ""
- echo "If your server is NATed (e.g. LowEndSpirit, Scaleway, or behind a router),"
- echo "then I need to know the address that can be used to access it from outside."
- echo "If that's not the case, just ignore this and leave the next field blank"
- read -p "External IP or domain name: " -e USEREXTERNALIP
- if [[ "$USEREXTERNALIP" != "" ]]; then
- IP=$USEREXTERNALIP
- fi
+fi
+# Try to detect a NATed connection and ask about it to potential LowEndSpirit/Scaleway users
+EXTERNALIP=$(wget -qO- ipv4.icanhazip.com)
+if [[ "$IP" != "$EXTERNALIP" ]]; then
+ echo ""
+ echo "Looks like your server is behind a NAT!"
+ echo ""
+ echo "If your server is NATed (e.g. LowEndSpirit, Scaleway, or behind a router),"
+ echo "then I need to know the address that can be used to access it from outside."
+ echo "If that's not the case, just ignore this and leave the next field blank"
+ read -p "External IP or domain name: " -e USEREXTERNALIP
+ if [[ "$USEREXTERNALIP" != "" ]]; then
+ IP=$USEREXTERNALIP
fi
+fi
- # client-template.txt is created so we have a template to add further users later
- echo "client" > ${file_client_tpl}
- if [[ "$PROTOCOL" = 'udp' ]]; then
- echo "proto ${PROTOCOL}" >> ${file_client_tpl}
- elif [[ "$PROTOCOL" = 'tcp' ]]; then
- echo "proto ${PROTOCOL}-client" >> ${file_client_tpl}
- fi
- echo "remote $IP $PORT
+# client-template.txt is created so we have a template to add further users later
+echo "client" > ${file_client_tpl}
+if [[ "$PROTOCOL" = 'udp' ]]; then
+ echo "proto ${PROTOCOL}" >> ${file_client_tpl}
+elif [[ "$PROTOCOL" = 'tcp' ]]; then
+ echo "proto ${PROTOCOL}-client" >> ${file_client_tpl}
+fi
+echo "remote $IP $PORT
dev tun
resolv-retry infinite
nobind
@@ -578,36 +550,22 @@ tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
setenv opt block-outside-dns
verb 3" >> ${file_client_tpl}
- # function Generate the custom client.ovpn
- newclient "$CLIENT"
- echo ""
- echo "Finished!"
- echo ""
- echo "Your client config is available at $homeDir/$CLIENT.ovpn"
- echo "If you want to add more clients, you simply need to run this script another time!"
+# call function Generate the custom client.ovpn
+generate_newclient "$CLIENT"
+echo ""
+echo "Finished!"
+echo ""
+echo "Your client config is available at $homeDir/$CLIENT.ovpn"
+echo "If you want to add more clients, you simply need to run this script another time!"
}
-detect_IP_NIC(){
-# Try to get our IP from the system and fallback to the Internet.
-# I do this to make the script compatible with NATed servers (LowEndSpirit/Scaleway)
-# and to avoid getting an IPv6.
-IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1)
-if [[ "$IP" = "" ]]; then
- IP=$(wget -qO- ipv4.icanhazip.com)
-fi
-# Get Internet network interface with default route
-NIC=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)' | head -1)
-
-
-}
config_openvpn(){
-
- while :
- do
- clear
-cat < $file_iptables
- fi
- iptables -t nat -D POSTROUTING -o $NIC -s 10.8.0.0/24 -j MASQUERADE
+ if iptables -L -n | grep -qE 'REJECT|DROP'; then
+ iptables -D INPUT -p ${PROTOCOL} --dport $PORT -j ACCEPT
+ iptables -D FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables-save > $file_iptables
- if hash sestatus 2>/dev/null; then
- if sestatus | grep "Current mode" | grep -qs "enforcing"; then
- if [[ "$PORT" != '1194' ]]; then
- semanage port -d -t openvpn_port_t -p ${PROTOCOL} $PORT
- fi
+ fi
+ iptables -t nat -D POSTROUTING -o $NIC -s 10.8.0.0/24 -j MASQUERADE
+ iptables-save > $file_iptables
+ if hash sestatus 2>/dev/null; then
+ if sestatus | grep "Current mode" | grep -qs "enforcing"; then
+ if [[ "$PORT" != '1194' ]]; then
+ semanage port -d -t openvpn_port_t -p ${PROTOCOL} $PORT
fi
fi
- if [[ "$OS" = 'debian' ]]; then
- apt-get autoremove --purge -y openvpn
- elif [[ "$OS" = 'arch' ]]; then
- pacman -R openvpn --noconfirm
- else
- yum remove openvpn -y
- fi
- rm -rf ${dir_openvpn} /usr/share/doc/openvpn*
- echo ""
- echo "OpenVPN removed!"
- else
- echo ""
- echo "Removal aborted!"
fi
- exit
- ;;
- 4) exit;;
- esac
- done
+ if [[ "$OS" = 'debian' ]]; then
+ apt-get autoremove --purge -y openvpn
+ elif [[ "$OS" = 'arch' ]]; then
+ pacman -R openvpn --noconfirm
+ else
+ yum remove openvpn -y
+ fi
+ rm -rf ${dir_openvpn} /usr/share/doc/openvpn*
+ echo ""
+ echo "OpenVPN removed!"
+ else
+ echo ""
+ echo "Removal aborted!"
+ fi
+ exit
+ ;;
+ 4) exit;;
+ esac
+done
}
+## function: determine the operating system version
+detect_os_ver(){
+
+if [[ -e /etc/debian_version ]]; then
+ OS="debian"
+ # Getting the version number, to verify that a recent version of OpenVPN is available
+ VERSION_ID=$(grep "VERSION_ID" /etc/os-release)
+ SYSCTL='/etc/sysctl.conf'
+ if [[ "$VERSION_ID" != 'VERSION_ID="7"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="8"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="9"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="12.04"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="14.04"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="16.04"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="16.10"' ]] && [[ "$VERSION_ID" != 'VERSION_ID="17.04"' ]]; then
+ echo 'Your version of Debian/Ubuntu is not supported.'
+ echo "I can't install a recent version of OpenVPN on your system."
+ echo ''
+ echo "However, if you're using Debian unstable/testing, or Ubuntu beta,"
+ echo 'then you can continue, a recent version of OpenVPN is available on these.'
+ echo 'Keep in mind they are not supported, though.'
+ while [[ "$CONTINUE" != [yn] ]]; do
+ read -p 'Continue ? [y/n]: ' -e CONTINUE
+ done
+ if [[ 'n' = "$CONTINUE" ]]; then
+ echo 'Ok, bye !'
+ exit 4
+ fi
+ fi
+elif [[ -e /etc/centos-release || -e /etc/redhat-release && ! -e /etc/fedora-release ]]; then
+ OS='centos'
+ SYSCTL='/etc/sysctl.conf'
+elif [[ -e /etc/arch-release ]]; then
+ OS='arch'
+ SYSCTL='/etc/sysctl.d/openvpn.conf'
+elif [[ -e /etc/fedora-release ]]; then
+ OS='fedora'
+ SYSCTL='/etc/sysctl.d/openvpn.conf'
+else
+ echo "Looks like you aren't running this installer on a Debian, Ubuntu, CentOS or ArchLinux system"
+ exit 4
+fi
+}
+
+detect_IP_NIC(){
+
+# Try to get our IP from the system and fallback to the Internet.
+# I do this to make the script compatible with NATed servers (LowEndSpirit/Scaleway)
+# and to avoid getting an IPv6.
+IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1)
+if [[ "$IP" = "" ]]; then
+ IP=$(wget -qO- ipv4.icanhazip.com)
+fi
+# Get Internet network interface with default route
+NIC=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)' | head -1)
+}
################################# main #################################
-detect_os_ver
-detect_IP_NIC
+main(){
+detect_os_ver ## call function
+detect_IP_NIC ## call function
## OpenVPN setup and first user creation
if [[ ! -e ${file_openvpn_conf} ]]; then
- install_openvpn
+ install_openvpn ## call function
fi
#### server.conf exist.
if [[ -e ${file_openvpn_conf} ]]; then
- config_openvpn
+ config_openvpn ## call function
fi
+}
-
-
-exit 0;
+main $@
+# exit 0;