部署脚本
#! /bin/bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATH#===============================================================================================# System Required: CentOS6.x/7 (32bit/64bit) or Ubuntu# Description: Install IKEV2 VPN for CentOS and Ubuntu# Author: quericy# Intro: https://quericy.me/blog/699#===============================================================================================clearVER=1.2.0echo "#############################################################"echo "# Install IKEV2 VPN for CentOS6.x/7 (32bit/64bit) or Ubuntu or Debian7/8.*"echo "# Intro: https://quericy.me/blog/699"echo "#"echo "# Author:quericy"echo "#"echo "# Version:$VER"echo "#############################################################"echo ""__INTERACTIVE=""if [ -t 1 ] ; then __INTERACTIVE="1"fi__green(){ if [ "$__INTERACTIVE" ] ; then printf '\033[1;31;32m' fi printf -- "$1" if [ "$__INTERACTIVE" ] ; then printf '\033[0m' fi}__red(){ if [ "$__INTERACTIVE" ] ; then printf '\033[1;31;40m' fi printf -- "$1" if [ "$__INTERACTIVE" ] ; then printf '\033[0m' fi}__yellow(){ if [ "$__INTERACTIVE" ] ; then printf '\033[1;31;33m' fi printf -- "$1" if [ "$__INTERACTIVE" ] ; then printf '\033[0m' fi}# Install IKEV2function install_ikev2(){ rootness disable_selinux get_system yum_install get_my_ip pre_install download_files setup_strongswan get_key configure_ipsec configure_strongswan configure_secrets SNAT_set iptables_check ipsec restart success_info}# Make sure only root can run our scriptfunction rootness(){if [[ $EUID -ne 0 ]]; then echo "Error:This script must be run as root!" 1>&2 exit 1fi}# Disable selinuxfunction disable_selinux(){if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0fi}# Ubuntu or CentOSfunction get_system(){ if grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then system_str="0" elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then system_str="1" elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then system_str="1" elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then system_str="1" else echo "This Script must be running at the CentOS or Ubuntu or Debian!" exit 1 fi}#install necessary libfunction yum_install(){ if [ "$system_str" = "0" ]; then yum -y update yum -y install pam-devel openssl-devel make gcc curl else apt-get -y update apt-get -y install libpam0g-dev libssl-dev make gcc curl fi}# Get IP address of the serverfunction get_my_ip(){ echo "Preparing, Please wait a moment..." IP=`curl -s checkip.dyndns.com | cut -d' ' -f 6 | cut -d'<' -f 1` if [ -z $IP ]; then IP=`curl -s ifconfig.me/ip` fi}# Pre-installation settingsfunction pre_install(){ echo "#############################################################" echo "# Install IKEV2 VPN for CentOS6.x/7 (32bit/64bit) or Ubuntu or Debian7/8.*" echo "# Intro: https://quericy.me/blog/699" echo "#" echo "# Author:quericy" echo "#" echo "# Version:$VER" echo "#############################################################" echo "please choose the type of your VPS(Xen、KVM: 1 , OpenVZ: 2):" read -p "your choice(1 or 2):" os_choice if [ "$os_choice" = "1" ]; then os="1" os_str="Xen、KVM" else if [ "$os_choice" = "2" ]; then os="2" os_str="OpenVZ" else echo "wrong choice!" exit 1 fi fi echo "please input the ip (or domain) of your VPS:" read -p "ip or domain(default_value:${IP}):" vps_ip if [ "$vps_ip" = "" ]; then vps_ip=$IP fi echo "Would you want to import existing cert? You NEED copy your cert file to the same directory of this script" read -p "yes or no?(default_value:no):" have_cert if [ "$have_cert" = "yes" ]; then have_cert="1" else have_cert="0" echo "please input the cert country(C):" read -p "C(default value:com):" my_cert_c if [ "$my_cert_c" = "" ]; then my_cert_c="com" fi echo "please input the cert organization(O):" read -p "O(default value:myvpn):" my_cert_o if [ "$my_cert_o" = "" ]; then my_cert_o="myvpn" fi echo "please input the cert common name(CN):" read -p "CN(default value:VPN CA):" my_cert_cn if [ "$my_cert_cn" = "" ]; then my_cert_cn="VPN CA" fi fi echo "####################################" get_char(){ SAVEDSTTY=`stty -g` stty -echo stty cbreak dd if=/dev/tty bs=1 count=1 2> /dev/null stty -raw stty echo stty $SAVEDSTTY } echo "Please confirm the information:" echo "" echo -e "the type of your server: [$(__green $os_str)]" echo -e "the ip(or domain) of your server: [$(__green $vps_ip)]" if [ "$have_cert" = "1" ]; then echo -e "$(__yellow "These are the certificate you MUST be prepared:")" echo -e "[$(__green "ca.cert.pem")]:The CA cert or the chain cert." echo -e "[$(__green "server.cert.pem")]:Your server cert." echo -e "[$(__green "server.pem")]:Your key of the server cert." echo -e "[$(__yellow "Please copy these file to the same directory of this script before start!")]" else echo -e "the cert_info:[$(__green "C=${my_cert_c}, O=${my_cert_o}")]" fi echo "" echo "Press any key to start...or Press Ctrl+C to cancel" char=`get_char` #Current folder cur_dir=`pwd` cd $cur_dir}# Download strongswanfunction download_files(){ strongswan_version='strongswan-5.9.0' strongswan_file="$strongswan_version.tar.gz" if [ -f $strongswan_file ];then echo -e "$strongswan_file [$(__green "found")]" else if ! wget --no-check-certificate https://download.strongswan.org/$strongswan_file;then echo "Failed to download $strongswan_file" exit 1 fi fi tar xzf $strongswan_file if [ $? -eq 0 ];then cd $cur_dir/$strongswan_version/ else echo "" echo "Unzip $strongswan_file failed! Please visit https://quericy.me/blog/699 and contact." exit 1 fi}# configure and install strongswanfunction setup_strongswan(){ if [ "$os" = "1" ]; then ./configure --enable-eap-identity --enable-eap-md5 \--enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap \--enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap \--enable-xauth-pam --enable-dhcp --enable-openssl --enable-addrblock --enable-unity \--enable-certexpire --enable-radattr --enable-swanctl --enable-openssl --disable-gmp else ./configure --enable-eap-identity --enable-eap-md5 \--enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap \--enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap \--enable-xauth-pam --enable-dhcp --enable-openssl --enable-addrblock --enable-unity \--enable-certexpire --enable-radattr --enable-swanctl --enable-openssl --disable-gmp --enable-kernel-libipsec fi make; make install}# configure cert and keyfunction get_key(){ cd $cur_dir if [ ! -d my_key ];then mkdir my_key fi if [ "$have_cert" = "1" ]; then import_cert else create_cert fi echo "####################################" get_char(){ SAVEDSTTY=`stty -g` stty -echo stty cbreak dd if=/dev/tty bs=1 count=1 2> /dev/null stty -raw stty echo stty $SAVEDSTTY } cp -f ca.cert.pem /usr/local/etc/ipsec.d/cacerts/ cp -f server.cert.pem /usr/local/etc/ipsec.d/certs/ cp -f server.pem /usr/local/etc/ipsec.d/private/ cp -f client.cert.pem /usr/local/etc/ipsec.d/certs/ cp -f client.pem /usr/local/etc/ipsec.d/private/ echo "Cert copy completed"}# import cert if user has ssl certificatefunction import_cert(){ cd $cur_dir if [ -f ca.cert.pem ];then cp -f ca.cert.pem my_key/ca.cert.pem echo -e "ca.cert.pem [$(__green "found")]" else echo -e "ca.cert.pem [$(__red "Not found!")]" exit fi if [ -f server.cert.pem ];then cp -f server.cert.pem my_key/server.cert.pem cp -f server.cert.pem my_key/client.cert.pem echo -e "server.cert.pem [$(__green "found")]" echo -e "client.cert.pem [$(__green "auto create")]" else echo -e "server.cert.pem [$(__red "Not found!,auto creating...")]" ipsec pki --gen --outform pem > server.pem ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem \ --cakey ca.pem --dn "C=${my_cert_c}, O=${my_cert_o}, CN=${vps_ip}" \ --san="${vps_ip}" --flag serverAuth --flag ikeIntermediate \ --outform pem > server.cert.pem cp -f server.cert.pem my_key/server.cert.pem cp -f server.cert.pem my_key/client.cert.pem echo -e "server.cert.pem [$(__green "created")]" echo -e "client.cert.pem [$(__green "auto create")]" fi if [ -f server.pem ];then cp -f server.pem my_key/server.pem cp -f server.pem my_key/client.pem echo -e "server.pem [$(__green "found")]" echo -e "client.pem [$(__green "auto create")]" else echo -e "server.pem [$(__red "Not found!")]" exit fi cd my_key}# auto create certificatefunction create_cert(){ cd $cur_dir cd my_key ipsec pki --gen --outform pem > ca.pem ipsec pki --self --in ca.pem --dn "C=${my_cert_c}, O=${my_cert_o}, CN=${my_cert_cn}" --ca --outform pem >ca.cert.pem ipsec pki --gen --outform pem > server.pem ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem \ --cakey ca.pem --dn "C=${my_cert_c}, O=${my_cert_o}, CN=${vps_ip}" \ --san="${vps_ip}" --flag serverAuth --flag ikeIntermediate \ --outform pem > server.cert.pem ipsec pki --gen --outform pem > client.pem ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=${my_cert_c}, O=${my_cert_o}, CN=VPN Client" --outform pem > client.cert.pem echo "configure the pkcs12 cert password(Can be empty):" openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" -certfile ca.cert.pem -caname "${my_cert_cn}" -out client.cert.p12}# configure the ipsec.conffunction configure_ipsec(){ cat > /usr/local/etc/ipsec.conf<<-EOFconfig setup uniqueids=never conn iOS_cert keyexchange=ikev1 fragmentation=yes left=%defaultroute leftauth=pubkey leftsubnet=0.0.0.0/0 leftcert=server.cert.pem right=%any rightauth=pubkey rightauth2=xauth rightsourceip=10.31.2.0/24 rightcert=client.cert.pem auto=addconn android_xauth_psk keyexchange=ikev1 left=%defaultroute leftauth=psk leftsubnet=0.0.0.0/0 right=%any rightauth=psk rightauth2=xauth rightsourceip=10.31.2.0/24 auto=addconn networkmanager-strongswan keyexchange=ikev2 left=%defaultroute leftauth=pubkey leftsubnet=0.0.0.0/0 leftcert=server.cert.pem right=%any rightauth=pubkey rightsourceip=10.31.2.0/24 rightcert=client.cert.pem auto=addconn ios_ikev2 keyexchange=ikev2 ike=aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048! esp=aes256-sha256,3des-sha1,aes256-sha1! rekey=no left=%defaultroute leftid=${vps_ip} leftsendcert=always leftsubnet=0.0.0.0/0 leftcert=server.cert.pem right=%any rightauth=eap-mschapv2 rightsourceip=10.31.2.0/24 rightsendcert=never eap_identity=%any dpdaction=clear fragmentation=yes auto=addconn windows7 keyexchange=ikev2 ike=aes256-sha1-modp1024! rekey=no left=%defaultroute leftauth=pubkey leftsubnet=0.0.0.0/0 leftcert=server.cert.pem right=%any rightauth=eap-mschapv2 rightsourceip=10.31.2.0/24 rightsendcert=never eap_identity=%any auto=addEOF}# configure the strongswan.conffunction configure_strongswan(){ cat > /usr/local/etc/strongswan.conf<<-EOF charon { load_modular = yes duplicheck { enable = no } compress = yes plugins { include strongswan.d/charon/*.conf } dns1 = 8.8.8.8 dns2 = 8.8.4.4 nbns1 = 8.8.8.8 nbns2 = 8.8.4.4}include strongswan.d/*.confEOF}# configure the ipsec.secretsfunction configure_secrets(){ cat > /usr/local/etc/ipsec.secrets<<-EOF: RSA server.pem: PSK "myPSKkey": XAUTH "myXAUTHPass"myUserName %any : EAP "myUserPass"EOF}function SNAT_set(){ echo "Use SNAT could implove the speed,but your server MUST have static ip address." read -p "yes or no?(default_value:no):" use_SNAT if [ "$use_SNAT" = "yes" ]; then use_SNAT_str="1" echo -e "$(__yellow "ip address info:")" ip address | grep inet echo "Some servers has elastic IP (AWS) or mapping IP.In this case,you should input the IP address which is binding in network interface." read -p "static ip or network interface ip (default_value:${IP}):" static_ip if [ "$static_ip" = "" ]; then static_ip=$IP fi else use_SNAT_str="0" fi}# iptables checkfunction iptables_check(){ cat > /etc/sysctl.d/10-ipsec.conf<<-EOFnet.ipv4.ip_forward=1EOF sysctl --system echo "Do you use firewall in CentOS7 instead of iptables?" read -p "yes or no?(default_value:no):" use_firewall if [ "$use_firewall" = "yes" ]; then firewall_set else iptables_set fi}# firewall set in CentOS7function firewall_set(){ if ! systemctl is-active firewalld > /dev/null; then systemctl start firewalld fi firewall-cmd --permanent --add-service="ipsec" firewall-cmd --permanent --add-port=500/udp firewall-cmd --permanent --add-port=4500/udp firewall-cmd --permanent --add-masquerade firewall-cmd --reload}# iptables setfunction iptables_set(){ echo -e "$(__yellow "ip address info:")" ip address | grep inet echo "The above content is the network card information of your VPS." echo "[$(__yellow "Important")]Please enter the name of the interface which can be connected to the public network." if [ "$os" = "1" ]; then read -p "Network card interface(default_value:eth0):" interface if [ "$interface" = "" ]; then interface="eth0" fi iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -s 10.31.0.0/24 -j ACCEPT iptables -A FORWARD -s 10.31.1.0/24 -j ACCEPT iptables -A FORWARD -s 10.31.2.0/24 -j ACCEPT iptables -A INPUT -i $interface -p esp -j ACCEPT iptables -A INPUT -i $interface -p udp --dport 500 -j ACCEPT iptables -A INPUT -i $interface -p tcp --dport 500 -j ACCEPT iptables -A INPUT -i $interface -p udp --dport 4500 -j ACCEPT iptables -A INPUT -i $interface -p udp --dport 1701 -j ACCEPT iptables -A INPUT -i $interface -p tcp --dport 1723 -j ACCEPT #iptables -A FORWARD -j REJECT if [ "$use_SNAT_str" = "1" ]; then iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o $interface -j SNAT --to-source $static_ip iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o $interface -j SNAT --to-source $static_ip iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o $interface -j SNAT --to-source $static_ip else iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o $interface -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o $interface -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o $interface -j MASQUERADE fi else read -p "Network card interface(default_value:venet0):" interface if [ "$interface" = "" ]; then interface="venet0" fi iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -s 10.31.0.0/24 -j ACCEPT iptables -A FORWARD -s 10.31.1.0/24 -j ACCEPT iptables -A FORWARD -s 10.31.2.0/24 -j ACCEPT iptables -A INPUT -i $interface -p esp -j ACCEPT iptables -A INPUT -i $interface -p udp --dport 500 -j ACCEPT iptables -A INPUT -i $interface -p tcp --dport 500 -j ACCEPT iptables -A INPUT -i $interface -p udp --dport 4500 -j ACCEPT iptables -A INPUT -i $interface -p udp --dport 1701 -j ACCEPT iptables -A INPUT -i $interface -p tcp --dport 1723 -j ACCEPT #iptables -A FORWARD -j REJECT if [ "$use_SNAT_str" = "1" ]; then iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o $interface -j SNAT --to-source $static_ip iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o $interface -j SNAT --to-source $static_ip iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o $interface -j SNAT --to-source $static_ip else iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o $interface -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o $interface -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o $interface -j MASQUERADE fi fi if [ "$system_str" = "0" ]; then service iptables save else iptables-save > /etc/iptables.rules cat > /etc/network/if-up.d/iptables<<-EOF#!/bin/shiptables-restore < /etc/iptables.rulesEOF chmod +x /etc/network/if-up.d/iptables fi}# echo the success infofunction success_info(){ echo "#############################################################" echo -e "#" echo -e "# [$(__green "Install Complete")]" echo -e "# Version:$VER" echo -e "# There is the default login info of your IPSec/IkeV2 VPN Service" echo -e "# UserName:$(__green " myUserName")" echo -e "# PassWord:$(__green " myUserPass")" echo -e "# PSK:$(__green " myPSKkey")" echo -e "# you should change default username and password in$(__green " /usr/local/etc/ipsec.secrets")" echo -e "# you cert:$(__green " ${cur_dir}/my_key/ca.cert.pem ")" if [ "$have_cert" = "1" ]; then echo -e "# you don't need to install cert if it's be trusted." else echo -e "# you must copy the cert to the client and install it." fi echo -e "#" echo -e "#############################################################" echo -e ""}# Initialization stepinstall_ikev2