From f103339165b0adcfd969545d76662120ee5f81d5 Mon Sep 17 00:00:00 2001 From: xiagw Date: Fri, 5 Jan 2018 15:15:01 +0800 Subject: [PATCH] function for all . --- openvpn-install.sh | 1041 ++++++++++++++++++++++---------------------- 1 file changed, 525 insertions(+), 516 deletions(-) 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;