From b8642ebf162f5f969a1eb6edf98bff3859588f17 Mon Sep 17 00:00:00 2001 From: al linux <1062721737@qq.com> Date: Fri, 11 Sep 2020 10:03:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extras/vpnupgrade.sh | 333 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 extras/vpnupgrade.sh diff --git a/extras/vpnupgrade.sh b/extras/vpnupgrade.sh new file mode 100644 index 0000000..63136cf --- /dev/null +++ b/extras/vpnupgrade.sh @@ -0,0 +1,333 @@ +#!/bin/sh +# +# Script to upgrade Libreswan on Ubuntu and Debian +# +# Copyright (C) 2016-2020 Lin Song +# +# This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 +# Unported License: http://creativecommons.org/licenses/by-sa/3.0/ +# +# Attribution required: please include my name in any derivative and let me +# know how you have improved it! + +# Specify which Libreswan version to install. See: https://libreswan.org +SWAN_VER=3.32 + +### DO NOT edit below this line ### + +export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + +exiterr() { echo "Error: $1" >&2; exit 1; } +exiterr2() { exiterr "'apt-get install' failed."; } + +vpnupgrade() { + +os_type=$(lsb_release -si 2>/dev/null) +if [ -z "$os_type" ]; then + [ -f /etc/os-release ] && os_type=$(. /etc/os-release && printf '%s' "$ID") + [ -f /etc/lsb-release ] && os_type=$(. /etc/lsb-release && printf '%s' "$DISTRIB_ID") +fi +if ! printf '%s' "$os_type" | head -n 1 | grep -qiF -e ubuntu -e debian -e raspbian; then + echo "Error: This script only supports Ubuntu and Debian." >&2 + echo "For CentOS/RHEL, use https://git.io/vpnupgrade-centos" >&2 + exit 1 +fi + +if [ "$(sed 's/\..*//' /etc/debian_version)" = "7" ]; then + exiterr "Debian 7 is not supported." +fi + +if [ -f /proc/user_beancounters ]; then + exiterr "OpenVZ VPS is not supported." +fi + +if [ "$(id -u)" != 0 ]; then + exiterr "Script must be run as root. Try 'sudo sh $0'" +fi + +case "$SWAN_VER" in + 3.19|3.2[01235679]|3.3[12]) + /bin/true + ;; + *) +cat 1>&2 </dev/null) +ipsec_ver_short=$(printf '%s' "$ipsec_ver" | sed -e 's/Linux Libreswan/Libreswan/' -e 's/ (netkey) on .*//') +if ! printf '%s' "$ipsec_ver" | grep -q "Libreswan"; then + exiterr "This script requires Libreswan already installed." +fi + +if printf '%s' "$ipsec_ver" | grep -qF "$SWAN_VER"; then + echo "You already have Libreswan version $SWAN_VER installed! " + echo "If you continue, the same version will be re-installed." + echo + printf "Do you want to continue anyway? [y/N] " + read -r response + case $response in + [yY][eE][sS]|[yY]) + echo + ;; + *) + echo "Abort. No changes were made." + exit 1 + ;; + esac +fi + +clear + +cat <st_seen_fragvid) { return FALSE; }' programs/pluto/ikev2.c + sed -i '1033s/if (/if (LIN(POLICY_IKE_FRAG_ALLOW, sk->ike->sa.st_connection->policy) \&\& sk->ike->sa.st_seen_fragvid \&\& /' \ + programs/pluto/ikev2_message.c +fi +cat > Makefile.inc.local <<'EOF' +WERROR_CFLAGS = -w +USE_DNSSEC = false +USE_DH31 = false +USE_NSS_AVA_COPY = true +USE_NSS_IPSEC_PROFILE = false +USE_GLIBC_KERN_FLIP_HEADERS = true +EOF +if [ "$SWAN_VER" = "3.31" ] || [ "$SWAN_VER" = "3.32" ]; then + echo "USE_DH2 = true" >> Makefile.inc.local + if ! grep -qs IFLA_XFRM_LINK /usr/include/linux/if_link.h; then + echo "USE_XFRM_INTERFACE_IFLA_HEADER = true" >> Makefile.inc.local + fi +fi +if [ "$(packaging/utils/lswan_detect.sh init)" = "systemd" ]; then + apt-get -yq install libsystemd-dev || exiterr2 +fi +NPROCS=$(grep -c ^processor /proc/cpuinfo) +[ -z "$NPROCS" ] && NPROCS=1 +make "-j$((NPROCS+1))" -s base && make -s install-base + +# Verify the install and clean up +cd /opt/src || exit 1 +/bin/rm -rf "/opt/src/libreswan-$SWAN_VER" +if ! /usr/local/sbin/ipsec --version 2>/dev/null | grep -qF "$SWAN_VER"; then + exiterr "Libreswan $SWAN_VER failed to build." +fi + +# Update ipsec.conf +IKE_NEW=" ike=aes256-sha2,aes128-sha2,aes256-sha1,aes128-sha1,aes256-sha2;modp1024,aes128-sha1;modp1024" +PHASE2_NEW=" phase2alg=aes_gcm-null,aes128-sha1,aes256-sha1,aes256-sha2_512,aes128-sha2,aes256-sha2" + +if uname -m | grep -qi '^arm'; then + if ! modprobe -q sha512; then + PHASE2_NEW=" phase2alg=aes_gcm-null,aes128-sha1,aes256-sha1,aes128-sha2,aes256-sha2" + fi +fi + +sed -i".old-$(date +%F-%T)" \ + -e "s/^[[:space:]]\+auth=esp\$/ phase2=esp/g" \ + -e "s/^[[:space:]]\+forceencaps=yes\$/ encapsulation=yes/g" \ + -e "s/^[[:space:]]\+ike=.\+\$/$IKE_NEW/g" \ + -e "s/^[[:space:]]\+phase2alg=.\+\$/$PHASE2_NEW/g" /etc/ipsec.conf + +if [ "$dns_state" = "1" ]; then + sed -i -e "s/modecfgdns1=.*/modecfgdns=\"$DNS_SRV1 $DNS_SRV2\"/" \ + -e "/modecfgdns2/d" /etc/ipsec.conf +elif [ "$dns_state" = "2" ]; then + sed -i "s/modecfgdns1=.*/modecfgdns=$DNS_SRV1/" /etc/ipsec.conf +elif [ "$dns_state" = "3" ]; then + sed -i "/modecfgdns=/a \ modecfgdns2=$DNS_SRV2" /etc/ipsec.conf + sed -i "s/modecfgdns=.*/modecfgdns1=$DNS_SRV1/" /etc/ipsec.conf +elif [ "$dns_state" = "4" ]; then + sed -i "s/modecfgdns=.*/modecfgdns1=$DNS_SRV1/" /etc/ipsec.conf +fi + +if [ "$SWAN_VER" = "3.29" ] || [ "$SWAN_VER" = "3.31" ] || [ "$SWAN_VER" = "3.32" ]; then + sed -i "/ikev2=never/d" /etc/ipsec.conf + sed -i "/conn shared/a \ ikev2=never" /etc/ipsec.conf +fi + +# Restart IPsec service +mkdir -p /run/pluto +service ipsec restart + +cat <