感谢  秋水逸冰  的一键安装L2TP的脚本,确实很方便,留待备用!

本脚本适用环境:
系统支持:CentOS6+,Debian7+,Ubuntu12+
内存要求:≥128M
更新日期:2016 年 09 月 12 日

关于本脚本:
名词解释如下
L2TP(Layer 2 Tunneling Protocol)
IPSec(Internet Protocol Security)
IKEv2 (Internet Key Exchange v2)
能实现 IPsec 的目前总体上有 openswan,libreswan,strongswan 这3种。
libreswan 是基于 openswan 的 fork,所以现在各个发行版基本已经看不到 openswan 的身影了。
当然也有使用 strongswan 的。

之所以要更新 L2TP 一键安装脚本,是因为随着各个 Linux 发行版不断推陈出新,原有的脚本已经不适应现在的需求。
本脚本通过编译安装最新版 libreswan 来实现 IPSec(CentOS7 下则是全部 yum 安装),yum 或 apt-get 来安装 xl2tpd,再根据各个发行版的使用方法不同,部署防火墙规则。

写在前面:
基于 OpenVZ 虚拟化技术的 VPS 需要开启TUN/TAP才能正常使用,购买 VPS 时请先咨询服务商是否支持开启 TUN/TAP。
纠正:
OpenVZ 虚拟的 VPS 需要系统内核支持 IPSec 才行。也就是说,母服务器的内核如果不支持的话那就没办法,只能换 VPS。
因此,一般不建议在 OpenVZ 的 VPS 上安装本脚本。脚本如果检测到该 VPS 为 OpenVZ 架构,会出现警告提醒。

如何检测是否支持TUN模块?
执行命令:
cat /dev/net/tun
如果返回信息为:cat: /dev/net/tun: File descriptor in bad state 说明正常
如何检测是否支持ppp模块?
执行命令:
cat /dev/ppp
如果返回信息为:cat: /dev/ppp: No such device or address 说明正常
当然,脚本在安装时也会执行检查,如果不适用于安装,脚本会予以提示。

使用方法:
root 用户登录后,运行以下命令:

wget --no-check-certificate https://raw.githubusercontent.com/teddysun/across/master/l2tp.sh
chmod +x l2tp.sh
./l2tp.sh

执行后,会有如下交互界面

Please input IP-Range:
(Default Range: 192.168.18):
输入本地IP段范围(本地电脑连接到VPS后给分配的一个本地IP地址),直接回车意味着输入默认值192.168.18

Please input PSK:
(Default PSK: teddysun.com):
PSK意为预共享密钥,即指定一个密钥将来在连接时需要用到,直接回车意味着输入默认值teddysun.com

Please input Username:
(Default Username: teddysun):
Username意为用户名,即第一个默认用户。直接回车意味着输入默认值teddysun

Please input teddysun’s password:
(Default Password: Q4SKhu2EXQ):
输入用户的密码,默认会随机生成一个10位包含大小写字母和数字的密码,当然你也可以指定密码。

ServerIP:your_server_main_IP
显示你的 VPS 的主 IP(如果是多 IP 的 VPS 也只显示一个)

Server Local IP:192.168.18.1
显示你的 VPS 的本地 IP(默认即可)

Client Remote IP Range:192.168.18.2-192.168.18.254
显示 IP 段范围

PSK:teddysun.com
显示 PSK

Press any key to start…or Press Ctrl+c to cancel
按下任意按键继续,如果想取消安装,请按Ctrl+c键

安装完成后,脚本会执行 ipsec verify 命令并提示如下:

If there are no [FAILED] above, then you can connect to your
L2TP ××× Server with the default Username/Password is below:ServerIP:your_server_IP
PSK:your PSK
Username:your usename
Password:your passwordIf you want to modify user settings, please use command(s):
l2tp -a (Add a user)
l2tp -d (Delete a user)
l2tp -l (List all users)
l2tp -m (Modify a user password)
Welcome to visit https://teddysun.com/448.html
Enjoy it!

如果你要想对用户进行操作,可以使用如下命令:
l2tp -a 新增用户
l2tp -d 删除用户
l2tp -m 修改现有的用户的密码
l2tp -l 列出所有用户名和密码
l2tp -h 列出帮助信息

其他事项:

1、脚本在安装完成后,已自动启动进程,并加入了开机自启动。
2、脚本会改写 iptables 或 firewalld 的规则。
3、脚本安装时,会即时将安装日志写到 /root/l2tp.log 文件里,如果你安装失败,可以通过此文件来寻找错误信息。

使用命令:
ipsec status (查看 IPSec 运行状态)
ipsec verify (查看 IPSec 检查结果)
/etc/init.d/ipsec start|stop|restart|status (CentOS6 下使用)
/etc/init.d/xl2tpd start|stop|restart (CentOS6 下使用)
systemctl start|stop|restart|status ipsec (CentOS7 下使用)
systemctl start|stop|restart xl2tpd (CentOS7 下使用)
service ipsec start|stop|restart|status (Debian/Ubuntu 下使用)
service xl2tpd start|stop|restart (Debian/Ubuntu 下使用)

评论节选(有改动),供参考

评论节选1(感谢@wawnnzxd 评论于 2016-11-10)

安卓6.0系统无法成功连接l2tp,查了谷歌之后发现好像是安卓是sha256加密
我是这么做的,目前正常连接一小时,没有断线,mac ios android
需要在 /etc/ipsec.conf 的 conn L2TP-PSK-noNAT 下加入

sha2-truncbug=yes

然后重启 IPSec 和 xl2tpd 服务,重新连接就可以了。
可以解决安卓 6.0 的 *** 无法连接问题。

评论节选2(感谢@S_ven 评论于 2016-10-17)

在/etc/ipsec.conf 的 conn L2TP-PSK-noNAT 下加入

leftnexthop defaultroute
rightnexthop defaultroute

然后重启 IPSec 和 xl2tpd 服务应该可以解决同一局域下多人连接的时候,出现连接不上的情况。
如果还是不行,就得看下这个链接里面的配置:
https://segmentfault.com/a/1190000005626927
我就是根据这个里面的配置和你的对比改好了。

更新日志
2016 年 04 月 18 日更新
1、目前在 Debian 7 上测试的结果,因为 libnss3 和 libnspr4 的版本过低而导致编译 libreswan 失败。临时解决办法是 dpkg 安装 libnss3_3.17.2 和 libnspr4_4.10.7 的 deb 包后重试
参考链接:https://libreswan.org/wiki/3.14_on_Debian_Wheezy

2016 年 04 月 19 日更新
2、修复了在 Debian 7 下因为 libnss3 和 libnspr4 的版本过低而导致编译 libreswan 失败的问题。

2016 年 04 月 22 日更新
3、修复了在 Ubuntu 16.04 下因为默认缺少 python 命令而导致 ipsec verify 等命令不能用的问题。

2016 年 04 月 25 日更新
4、在 Vultr 的 Debian 7 的系统模板下安装时,软件包 libcurl4-nss-dev 会出现依赖错误。如下所示:
The following packages have unmet dependencies:
libcurl4-nss-dev : Depends: libldap2-dev but it is not going to be installed
Depends: librtmp-dev but it is not going to be installed

而 libldap2-dev 和 librtmp-dev 又依赖了其他几种软件包。总之最后的依赖关系如下: 
libldap2-dev : Depends: libldap-2.4-2 (= 2.4.31-2+deb7u1) but 2.4.31+really2.4.40+dfsg-1+deb8u1~bpo70+1 is to be installed
librtmp-dev : Depends: libgnutls-dev but it is not going to be installed
libgnutls-dev : Depends: libp11-kit-dev (>= 0.4) but it is not going to be installed
libp11-kit-dev : Depends: libp11-kit0 (= 0.12-3) but 0.20.7-1~bpo70+1 is to be installed

那么解决办法就是把最底层的依赖包 libp11-kit0 先卸载掉,然后再安装 libcurl4-nss-dev 即可。

apt-get -y remove libp11-kit0
apt-get -y --no-install-recommends install libcurl4-nss-dev wget

然后再运行脚本安装即可。

2016 年 06 月 10 日更新
脚本在安装完成后,新增了几个命令,便于操作用户
l2tp -a 新增用户
l2tp -d 删除用户
l2tp -l 列出所有用户
l2tp -h 列出帮助信息

2016 年 08 月 05 日更新
升级 libreswan 到版本 3.18。

2016 年 08 月 13 日更新
修正 Debian 8 下的 sd-daemon.h: No such file or directory 问题,是由于缺少依赖包 libsystemd-daemon-dev 导致的。

2016 年 09 月 12 日更新
修正了在 CentOS 6 下 libevent2 依赖的问题;
新增了一个 -m 选项,用以修改现有用户的密码。

附带安装脚本内容如下:

#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
#=======================================================================#
#   System Supported:  CentOS 6+ / Debian 7+ / Ubuntu 12+               #
#   Description: L2TP ××× Auto Installer                                #
#   Author: Teddysun <i@teddysun.com>                                   #
#   Intro:  https://teddysun.com/448.html                               #
#=======================================================================#
cur_dir=`pwd`libevent2_src_filename="libevent-2.0.22-stable"
libreswan_filename="libreswan-3.18"rootness(){if [[ $EUID -ne 0 ]]; thenecho "Error:This script must be run as root!" 1>&2exit 1fi
}tunavailable(){if [[ ! -e /dev/net/tun ]]; thenecho "Error:TUN/TAP is not available!" 1>&2exit 1fi
}disable_selinux(){
if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; thensed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/configsetenforce 0
fi
}get_opsy(){[ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return[ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return[ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return
}get_os_info(){IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1 )if [ -z ${IP} ]; thenIP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )filocal cname=$( awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' )local cores=$( awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo )local freq=$( awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' )local tram=$( free -m | awk '/Mem/ {print $2}' )local swap=$( free -m | awk '/Swap/ {print $2}' )local up=$( awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=$1%60} {printf("%ddays, %d:%d:%d\n",a,b,c,d)}' /proc/uptime )local load=$( w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' )local opsy=$( get_opsy )local arch=$( uname -m )local lbit=$( getconf LONG_BIT )local host=$( hostname )local kern=$( uname -r )echo "########## System Information ##########"echo echo "CPU model            : ${cname}"echo "Number of cores      : ${cores}"echo "CPU frequency        : ${freq} MHz"echo "Total amount of ram  : ${tram} MB"echo "Total amount of swap : ${swap} MB"echo "System uptime        : ${up}"echo "Load average         : ${load}"echo "OS                   : ${opsy}"echo "Arch                 : ${arch} (${lbit} Bit)"echo "Kernel               : ${kern}"echo "Hostname             : ${host}"echo "IPv4 address         : ${IP}"echo echo "########################################"
}check_sys(){local checkType=$1local value=$2local release=''local systemPackage=''if [[ -f /etc/redhat-release ]];thenrelease="centos"systemPackage="yum"elif cat /etc/issue | grep -q -E -i "debian";thenrelease="debian"systemPackage="apt"elif cat /etc/issue | grep -q -E -i "ubuntu";thenrelease="ubuntu"systemPackage="apt"elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat";thenrelease="centos"systemPackage="yum"elif cat /proc/version | grep -q -E -i "debian";thenrelease="debian"systemPackage="apt"elif cat /proc/version | grep -q -E -i "ubuntu";thenrelease="ubuntu"systemPackage="apt"elif cat /proc/version | grep -q -E -i "centos|red hat|redhat";thenrelease="centos"systemPackage="yum"fiif [[ ${checkType} == "sysRelease" ]]; thenif [ "$value" == "$release" ];thenreturn 0elsereturn 1fielif [[ ${checkType} == "packageManager" ]]; thenif [ "$value" == "$systemPackage" ];thenreturn 0elsereturn 1fifi
}rand() {index=0str=""for i in {a..z}; do arr[index]=${i}; index=`expr ${index} + 1`; donefor i in {A..Z}; do arr[index]=${i}; index=`expr ${index} + 1`; donefor i in {0..9}; do arr[index]=${i}; index=`expr ${index} + 1`; donefor i in {1..10}; do str="$str${arr[$RANDOM%$index]}"; doneecho ${str}
}is_64bit(){if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; thenreturn 0elsereturn 1fi
}download_file(){local download_root_url="http://dl.teddysun.com/files"if [ -s ${1} ]; thenecho "$1 [found]"elseecho "$1 not found!!!download now..."if ! wget -c -t3 -T60 ${download_root_url}/${1};thenecho "Failed to download $1, please download it to ${cur_dir} directory manually and try again."exit 1fifi
}versionget(){if [[ -s /etc/redhat-release ]];thengrep -oE  "[0-9.]+" /etc/redhat-releaseelsegrep -oE  "[0-9.]+" /etc/issuefi
}centosversion(){if check_sys sysRelease centos;thenlocal code=${1}local version="`versionget`"local main_ver=${version%%.*}if [ "${main_ver}" == "${code}" ];thenreturn 0elsereturn 1fielsereturn 1fi
}debianversion(){if check_sys sysRelease debian;thenlocal version=$( get_opsy )local code=${1}local main_ver=$( echo ${version} | sed 's/[^0-9]//g')if [ "${main_ver}" == "${code}" ];thenreturn 0elsereturn 1fielsereturn 1fi
}version_check(){if check_sys packageManager yum; thenif centosversion 5; thenecho "Error: CentOS 5 is not supported, Please re-install OS and try again."exit 1fifi
}preinstall_l2tp(){echoif [ -d "/proc/vz" ]; thenecho -e "\033[41;37m WARNING: \033[0m Your VPS is based on OpenVZ, and IPSec might not be supported by the kernel."echo "Continue installation? (y/n)"read -p "(Default: n)" agree[ -z ${agree} ] && agree="n"if [ "${agree}" == "n" ]; thenechoecho "L2TP installation cancelled."echoexit 0fifiechoecho "Please enter IP-Range:"read -p "(Default Range: 192.168.18):" iprange[ -z ${iprange} ] && iprange="192.168.18"echo "Please enter PSK:"read -p "(Default PSK: teddysun.com):" mypsk[ -z ${mypsk} ] && mypsk="teddysun.com"echo "Please enter Username:"read -p "(Default Username: teddysun):" username[ -z ${username} ] && username="teddysun"password=`rand`echo "Please enter ${username}'s password:"read -p "(Default Password: ${password}):" tmppassword[ ! -z ${tmppassword} ] && password=${tmppassword}get_char(){SAVEDSTTY=`stty -g`stty -echostty cbreakdd if=/dev/tty bs=1 count=1 2> /dev/nullstty -rawstty echostty $SAVEDSTTY}echoecho "ServerIP:${IP}"echo "Server Local IP:${iprange}.1"echo "Client Remote IP Range:${iprange}.2-${iprange}.254"echo "PSK:${mypsk}"echoecho "Press any key to start... or press Ctrl + C to cancel."char=`get_char`}install_l2tp(){mknod /dev/random c 1 9if check_sys packageManager apt;thenapt-get -y updateif debianversion 7;thenif is_64bit;thenlocal libnspr4_filename1="libnspr4_4.10.7-1_amd64.deb"local libnspr4_filename2="libnspr4-0d_4.10.7-1_amd64.deb"local libnspr4_filename3="libnspr4-dev_4.10.7-1_amd64.deb"local libnspr4_filename4="libnspr4-dbg_4.10.7-1_amd64.deb"local libnss3_filename1="libnss3_3.17.2-1.1_amd64.deb"local libnss3_filename2="libnss3-1d_3.17.2-1.1_amd64.deb"local libnss3_filename3="libnss3-tools_3.17.2-1.1_amd64.deb"local libnss3_filename4="libnss3-dev_3.17.2-1.1_amd64.deb"local libnss3_filename5="libnss3-dbg_3.17.2-1.1_amd64.deb"elselocal libnspr4_filename1="libnspr4_4.10.7-1_i386.deb"local libnspr4_filename2="libnspr4-0d_4.10.7-1_i386.deb"local libnspr4_filename3="libnspr4-dev_4.10.7-1_i386.deb"local libnspr4_filename4="libnspr4-dbg_4.10.7-1_i386.deb"local libnss3_filename1="libnss3_3.17.2-1.1_i386.deb"local libnss3_filename2="libnss3-1d_3.17.2-1.1_i386.deb"local libnss3_filename3="libnss3-tools_3.17.2-1.1_i386.deb"local libnss3_filename4="libnss3-dev_3.17.2-1.1_i386.deb"local libnss3_filename5="libnss3-dbg_3.17.2-1.1_i386.deb"firm -rf ${cur_dir}/l2tpmkdir -p ${cur_dir}/l2tpcd ${cur_dir}/l2tpdownload_file "${libnspr4_filename1}"download_file "${libnspr4_filename2}"download_file "${libnspr4_filename3}"download_file "${libnspr4_filename4}"download_file "${libnss3_filename1}"download_file "${libnss3_filename2}"download_file "${libnss3_filename3}"download_file "${libnss3_filename4}"download_file "${libnss3_filename5}"dpkg -i ${libnspr4_filename1} ${libnspr4_filename2} ${libnspr4_filename3} ${libnspr4_filename4}dpkg -i ${libnss3_filename1} ${libnss3_filename2} ${libnss3_filename3} ${libnss3_filename4} ${libnss3_filename5}apt-get -y install wget gcc ppp flex bison make pkg-config libpam0g-dev libcap-ng-dev libcap-ng-utils libunbound-dev libevent-dev libcurl4-nss-dev libsystemd-daemon-develseapt-get -y install wget gcc ppp flex bison make python libnss3-dev libnspr4-dev pkg-config libpam0g-dev libcap-ng-dev libcap-ng-utils libunbound-dev libnss3-tools libevent-dev libcurl4-nss-dev libsystemd-daemon-devfiapt-get -y --no-install-recommends install xmltoapt-get -y install xl2tpdcompile_installelif check_sys packageManager yum; thenif centosversion 7; thenyum -y install epel-releaseyum -y install ppp libreswan xl2tpd firewalldyum_installelif centosversion 6; thenyum -y install epel-releaseyum -y install gcc gcc-c++ ppp iptables make gmp-devel xmlto bison flex libpcap-devel lsofyum -y install xl2tpd curl-devel nss-devel nspr-devel pkgconfig pam-devel unbound-devel libcap-ng-develcompile_installfifi}compile_install(){rm -rf ${cur_dir}/l2tpmkdir -p ${cur_dir}/l2tpcd ${cur_dir}/l2tpdownload_file "${libreswan_filename}.tar.gz"tar -zxf ${libreswan_filename}.tar.gzif centosversion 6; thendownload_file "${libevent2_src_filename}.tar.gz"tar -zxf ${libevent2_src_filename}.tar.gzcd ${libevent2_src_filename}./configuremake && make installif [ $? -eq 0 ]; thenif is_64bit;thenln -sf /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5ln -sf /usr/local/lib/libevent_pthreads-2.0.so.5 /usr/lib64/libevent_pthreads-2.0.so.5elseln -sf /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5ln -sf /usr/local/lib/libevent_pthreads-2.0.so.5 /usr/lib/libevent_pthreads-2.0.so.5fiecho "/usr/local/lib" > /etc/ld.so.conf.d/local.confldconfigelseecho "libevent2 install failed..."exit 1fificd ${cur_dir}/l2tp/${libreswan_filename}echo "WERROR_CFLAGS =" > Makefile.inc.localmake programs && make install/usr/local/sbin/ipsec --version >/dev/null 2>&1if [ $? -ne 0 ];thenecho "${libreswan_filename} install failed."exit 1ficat > /etc/ipsec.conf<<EOF
config setupnat_traversal=yesprotostack=netkeyoe=offinterfaces="%defaultroute"dumpdir=/var/run/pluto/virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10conn L2TP-PSK-NATrightsubnet=vhost:%privalso=L2TP-PSK-noNATconn L2TP-PSK-noNATauthby=secretpfs=noauto=addkeyingtries=3rekey=noikelifetime=8hkeylife=1htype=transportleft=${IP}leftid=${IP}leftprotoport=17/1701right=%anyrightprotoport=17/%anydpddelay=40dpdtimeout=130dpdaction=clear
EOFcat > /etc/ipsec.secrets<<EOF
${IP} %any: PSK "${mypsk}"
EOFcat > /etc/xl2tpd/xl2tpd.conf<<EOF
[global]
listen-addr = ${IP}
[lns default]
ip range = ${iprange}.2-${iprange}.254
local ip = ${iprange}.1
require chap = yes
refuse pap = yes
require authentication = yes
name = Linux×××server
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
EOFcat > /etc/ppp/options.xl2tpd<<EOF
ipcp-accept-local
ipcp-accept-remote
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
noccp
auth
crtscts
hide-password
idle 1800
mtu 1410
mru 1410
nodefaultroute
name l2tpd
debug
lock
proxyarp
connect-delay 5000
EOFrm -f /etc/ppp/chap-secretscat > /etc/ppp/chap-secrets<<EOF
# Secrets for authentication using CHAP
# client    server    secret    IP addresses
${username}    l2tpd    ${password}       *
EOFcp -pf /etc/sysctl.conf /etc/sysctl.conf.baksed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conffor each in `ls /proc/sys/net/ipv4/conf/`doecho "net.ipv4.conf.${each}.accept_source_route=0" >> /etc/sysctl.confecho "net.ipv4.conf.${each}.accept_redirects=0" >> /etc/sysctl.confecho "net.ipv4.conf.${each}.send_redirects=0" >> /etc/sysctl.confecho "net.ipv4.conf.${each}.rp_filter=0" >> /etc/sysctl.confdonesysctl -pif centosversion 6; then[ -f /etc/sysconfig/iptables ] && cp -pf /etc/sysconfig/iptables /etc/sysconfig/iptables.old.`date +%Y%m%d`if [ "`/sbin/iptables-save | grep -c '^\-'`" = "0" ]; thencat > /etc/sysconfig/iptables <<EOF
# Added by L2TP ××× script
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s ${iprange}.0/24  -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
COMMIT
EOFelseiptables -I INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPTiptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -I FORWARD -s ${iprange}.0/24  -j ACCEPTiptables -t nat -A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}/etc/init.d/iptables savefiif [ ! -f /etc/ipsec.d/cert9.db ]; thenecho > /var/tmp/libreswan-nss-pwdcertutil -N -f /var/tmp/libreswan-nss-pwd -d /etc/ipsec.drm -f /var/tmp/libreswan-nss-pwdfichkconfig --add iptableschkconfig iptables onchkconfig --add ipsecchkconfig ipsec onchkconfig --add xl2tpdchkconfig xl2tpd on/etc/init.d/iptables restart/etc/init.d/ipsec start/etc/init.d/xl2tpd startelse[ -f /etc/iptables.rules ] && cp -pf /etc/iptables.rules /etc/iptables.rules.old.`date +%Y%m%d`if [ "`/sbin/iptables-save | grep -c '^\-'`" = "0" ]; thencat > /etc/iptables.rules <<EOF
# Added by L2TP ××× script
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s ${iprange}.0/24  -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}
COMMIT
EOFelseiptables -I INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPTiptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -I FORWARD -s ${iprange}.0/24  -j ACCEPTiptables -t nat -A POSTROUTING -s ${iprange}.0/24 -j SNAT --to-source ${IP}/sbin/iptables-save > /etc/iptables.rulesficat > /etc/network/if-up.d/iptables <<EOF
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules
EOFchmod +x /etc/network/if-up.d/iptablesif [ ! -f /etc/ipsec.d/cert9.db ]; thenecho > /var/tmp/libreswan-nss-pwdcertutil -N -f /var/tmp/libreswan-nss-pwd -d /etc/ipsec.drm -f /var/tmp/libreswan-nss-pwdfiupdate-rc.d -f xl2tpd defaultscp -f /etc/rc.local /etc/rc.local.old.`date +%Y%m%d`sed --follow-symlinks -i -e '/^exit 0/d' /etc/rc.localcat >> /etc/rc.local <<EOF# Added by L2TP ××× script
echo 1 > /proc/sys/net/ipv4/ip_forward
/usr/sbin/service ipsec start
exit 0
EOFchmod +x /etc/rc.localecho 1 > /proc/sys/net/ipv4/ip_forward/sbin/iptables-restore < /etc/iptables.rules/usr/sbin/service ipsec start/usr/sbin/service xl2tpd restartfi}yum_install(){rm -f /etc/ipsec.confcat > /etc/ipsec.conf<<EOF
config setupnat_traversal=yesprotostack=netkeyoe=offinterfaces="%defaultroute"dumpdir=/var/run/pluto/virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10conn L2TP-PSK-NATrightsubnet=vhost:%privalso=L2TP-PSK-noNATconn L2TP-PSK-noNATauthby=secretpfs=noauto=addkeyingtries=3rekey=noikelifetime=8hkeylife=1htype=transportleft=${IP}leftid=${IP}leftprotoport=17/1701right=%anyrightprotoport=17/%anydpddelay=40dpdtimeout=130dpdaction=clear
EOFrm -f /etc/ipsec.secretscat > /etc/ipsec.secrets<<EOF
${IP} %any: PSK "${mypsk}"
EOFrm -f /etc/xl2tpd/xl2tpd.confcat > /etc/xl2tpd/xl2tpd.conf<<EOF
[global]
listen-addr = ${IP}
[lns default]
ip range = ${iprange}.2-${iprange}.254
local ip = ${iprange}.1
require chap = yes
refuse pap = yes
require authentication = yes
name = Linux×××server
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
EOFrm -f /etc/ppp/options.xl2tpdcat > /etc/ppp/options.xl2tpd<<EOF
ipcp-accept-local
ipcp-accept-remote
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
noccp
auth
crtscts
hide-password
idle 1800
mtu 1410
mru 1410
nodefaultroute
name l2tpd
debug
lock
proxyarp
connect-delay 5000
EOFrm -f /etc/ppp/chap-secretscat > /etc/ppp/chap-secrets<<EOF
# Secrets for authentication using CHAP
# client    server    secret    IP addresses
${username}    l2tpd    ${password}       *
EOFcp -pf /etc/sysctl.conf /etc/sysctl.conf.bakecho "# Added by L2TP ×××" >> /etc/sysctl.confecho "net.ipv4.ip_forward=1" >> /etc/sysctl.confecho "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.confecho "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.confecho "net.ipv4.icmp_ignore_bogus_error_responses=1" >> /etc/sysctl.conffor each in `ls /proc/sys/net/ipv4/conf/`doecho "net.ipv4.conf.${each}.accept_source_route=0" >> /etc/sysctl.confecho "net.ipv4.conf.${each}.accept_redirects=0" >> /etc/sysctl.confecho "net.ipv4.conf.${each}.send_redirects=0" >> /etc/sysctl.confecho "net.ipv4.conf.${each}.rp_filter=0" >> /etc/sysctl.confdonesysctl -pcat > /usr/lib/firewalld/services/xl2tpd.xml<<EOF
<?xml version="1.0" encoding="utf-8"?>
<service><short>xl2tpd</short><description>L2TP IPSec</description><port protocol="udp" port="4500"/><port protocol="udp" port="1701"/>
</service>
EOFchmod 640 /usr/lib/firewalld/services/xl2tpd.xmlsystemctl enable ipsecsystemctl enable xl2tpdsystemctl enable firewalldsystemctl status firewalld > /dev/null 2>&1if [ $? -eq 0 ];thenecho "Checking firewalld status..."firewall-cmd --list-allecho "add firewalld rules..."firewall-cmd --permanent --add-service=ipsecfirewall-cmd --permanent --add-service=xl2tpdfirewall-cmd --permanent --add-masqueradefirewall-cmd --reloadelseecho "Firewalld looks like not running, trying to start..."systemctl start firewalldif [ $? -eq 0 ];thenecho "Firewalld start successfully..."echo "Checking firewalld status..."firewall-cmd --list-allecho "adding firewalld rules..."firewall-cmd --permanent --add-service=ipsecfirewall-cmd --permanent --add-service=xl2tpdfirewall-cmd --permanent --add-masqueradefirewall-cmd --reloadelseecho "Failed to start firewalld. please enable port 500 4500 manually if necessary."fifisystemctl restart ipsecsystemctl restart xl2tpdecho "Checking ipsec status..."systemctl -a | grep ipsececho "Checking xl2tpd status..."systemctl -a | grep xl2tpdecho "Checking firewalld status..."firewall-cmd --list-allfirewall-cmd --list-all | grep xl2tpd > /dev/null 2>&1if [ $? -ne 0 ];thenfirewall-cmd --permanent --add-service=xl2tpdfirewall-cmd --reloadfi}finally(){cd ${cur_dir}rm -fr ${cur_dir}/l2tp# create l2tp commandcp -f ${cur_dir}/`basename $0` /usr/bin/l2tpecho "Please wait a moment..."sleep 5ipsec verifyechoecho "###############################################################"echo "# L2TP ××× Auto Installer                                     #"echo "# System Supported: CentOS 6+ / Debian 7+ / Ubuntu 12+        #"echo "# Intro: https://teddysun.com/448.html                        #"echo "# Author: Teddysun <i@teddysun.com>                           #"echo "###############################################################"echo "If there is no [FAILED] above, you can connect to your L2TP "echo "××× Server with the default Username/Password is below:"echoecho "ServerIP:${IP}"echo "PSK:${mypsk}"echo "Username:${username}"echo "Password:${password}"echoecho "If you want to modify user settings, please use command(s):"echo "l2tp -a (Add a user)"echo "l2tp -d (Delete a user)"echo "l2tp -l (List all users)"echo "l2tp -m (Modify a user password)"echoecho "Welcome to visit https://teddysun.com/448.html"echo "Enjoy it!"echo
}l2tp(){clearechoecho "###############################################################"echo "# L2TP ××× Auto Installer                                     #"echo "# System Supported: CentOS 6+ / Debian 7+ / Ubuntu 12+        #"echo "# Intro: https://teddysun.com/448.html                        #"echo "# Author: Teddysun <i@teddysun.com>                           #"echo "###############################################################"echorootnesstunavailabledisable_selinuxversion_checkget_os_infopreinstall_l2tpinstall_l2tpfinally
}list_users(){if [ ! -f /etc/ppp/chap-secrets ];thenecho "Error: /etc/ppp/chap-secrets file not found."exit 1filocal line="+-------------------------------------------+\n"local string=%20sprintf "${line}|${string} |${string} |\n${line}" Username Passwordgrep -v "^#" /etc/ppp/chap-secrets | awk '{printf "|'${string}' |'${string}' |\n", $1,$3}'printf ${line}
}add_user(){while :doread -p "Please input your Username:" userif [ -z ${user} ]; thenecho "Username can not be empty"elsegrep -w "${user}" /etc/ppp/chap-secrets > /dev/null 2>&1if [ $? -eq 0 ];thenecho "Username (${user}) already exists. Please re-enter your username."elsebreakfifidonepass=`rand`echo "Please input ${user}'s password:"read -p "(Default Password: ${pass}):" tmppass[ ! -z ${tmppass} ] && pass=${tmppass}echo "${user}    l2tpd    ${pass}       *" >> /etc/ppp/chap-secretsecho "Username (${user}) add completed."
}del_user(){while :doread -p "Please input Username you want to delete it:" userif [ -z ${user} ]; thenecho "Username can not be empty"elsegrep -w "${user}" /etc/ppp/chap-secrets >/dev/null 2>&1if [ $? -eq 0 ];thenbreakelseecho "Username (${user}) is not exists. Please re-enter your username."fifidonesed -i "/^\<${user}\>/d" /etc/ppp/chap-secretsecho "Username (${user}) delete completed."
}mod_user(){while :doread -p "Please input Username you want to change password:" userif [ -z ${user} ]; thenecho "Username can not be empty"elsegrep -w "${user}" /etc/ppp/chap-secrets >/dev/null 2>&1if [ $? -eq 0 ];thenbreakelseecho "Username (${user}) is not exists. Please re-enter your username."fifidonepass=`rand`echo "Please input ${user}'s new password:"read -p "(Default Password: ${pass}):" tmppass[ ! -z ${tmppass} ] && pass=${tmppass}sed -i "/^\<${user}\>/d" /etc/ppp/chap-secretsecho "${user}    l2tpd    ${pass}       *" >> /etc/ppp/chap-secretsecho "Username ${user}'s password has been changed."
}# Main process
action=$1
if [ -z ${action} ] && [ "`basename $0`" != "l2tp" ]; thenaction=install
ficase ${action} ininstall)l2tp 2>&1 | tee /root/l2tp.log;;-l|--list)list_users;;-a|--add)add_user;;-d|--del)del_user;;-m|--mod)mod_user;;-h|--help)echo "Usage: `basename $0` -l,--list   List all users"echo "       `basename $0` -a,--add    Add a user"echo "       `basename $0` -d,--del    Delete a user"echo "       `basename $0` -m,--mod    Modify a user password"echo "       `basename $0` -h,--help   Print this help information";;*)echo "Usage: `basename $0` [-l,--list|-a,--add|-d,--del|-m,--mod|-h,--help]" && exit;;
esac

转载请注明:秋水逸冰  L2TP/IPSec一键安装脚本

转载于:https://blog.51cto.com/richylu/1893986

L2TP/IPSec一键安装脚本相关推荐

  1. CentOS7下pptp ***一键安装脚本

    CentOS 6.7下pptp ***一键安装脚本,安装如下: wget http://mirrors.linuxeye.com/scripts/***_centos.sh chmod +x ./** ...

  2. mysql脚本简书,mysql一键安装脚本

    #!/bin/bash #MySQL一键安装脚本 #脚本运行前请确认本机没有安装其他版本的MySQL #运行脚本前请详细阅读my.cnf文件 PASSWORD=`cat my.cnf | grep p ...

  3. *** Python版一键安装脚本

    本脚本适用环境: 系统支持:CentOS 6,7,Debian,Ubuntu 内存要求:≥128M 日期:2018 年 02 月 07 日 关于本脚本: 一键安装 Python 版 *** 的最新版. ...

  4. nginx一键安装脚本

    nginx一键安装脚本 [root@cc nginx]# cat nginx_install.sh #!/bin/bash # > File Name: nginx_install.sh # & ...

  5. linux安装yum的脚本,lnmp一键安装脚本yum方式快速安装

    自己编写的yum安装方式的LNMP一键安装脚本,yum方式安装,速度非常快,目前只有centos版本,其他系统没有弄. Centos5 chmod +x lnmp.sh sh lnmp.sh Cent ...

  6. NPS内网穿透服务端一键安装脚本

    NPS内网穿透服务端一键安装脚本,支持安装,更新,卸载以及重新生成配置文件,基于官方GitHub制作,自动安装最新版本 作者博客链接 脚本概览 安装 wget https://content.928w ...

  7. Frps一键安装脚本,带Frpc Windows便捷启动脚本

    说明:Frp估计很多人都用过,一个高性能的内网穿透工具,支持tcp.udp.http.https协议,安装和使用教程可以直接查看官方中文文档→传送门,写的超详细.这里博主分享个某大佬写的Frps一键脚 ...

  8. [转] *** 一键安装脚本(四合一)

    [from] https://teddysun.com/486.html 本脚本适用环境 系统支持:CentOS 6+,Debian 7+,Ubuntu 12+ 内存要求:≥128M 日期 :2017 ...

  9. Linux安装lamp脚本,CentOS LAMP一键安装脚本

    LAMP简单介绍 LAMP指的Linux(操作系统).Apache(HTTP 服务器),MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python)的第一个字母缩写, ...

  10. You-Get, Annie 视频下载器 一键安装脚本

    受限于 CSDN 的审核,本文章以后不再跟进更新.最后编辑于 2020-04-10 . 视频下载器 一键配置脚本 (Windows) 快速配置和使用 You-Get , *******-dl , An ...

最新文章

  1. dp入门 专题记录 2017-7-26
  2. Winform自动更新组件分享
  3. java综合图形界面程序设计_java综合图形界面程序设计.doc
  4. tcp retransmission原因
  5. 原生JS、jQuery 遍历方法总结
  6. python 用户登录判断
  7. Leetcode 30.串联所有单词的子串
  8. python模块(一)------math模块及其常用方法
  9. 谷歌浏览器安装失败,解决办法
  10. 在线图片裁剪,关于使用cropperjs踩过的坑
  11. 如何用公式计算计算机的及格率,及格率和优秀率公式 在excel中如何计算及...
  12. 切!原来进入500强就那么简单啊——前IBM,HP,Dell员工揭开外企的招聘内幕
  13. JavasScript 第一天课 课后笔记 2022.3.21
  14. Android 九宫格物理键盘数字英文切换
  15. ie input兼容 vue_vue+iview 兼容IE11浏览器的实现方法
  16. 根据IP地址获取地理位置
  17. 火狐使用js下载文件_如何使用Firefox Send安全地将大文件发送给任何人
  18. 视频教程-Kali Linux 网络安全渗透测试-渗透测试
  19. H3C防火墙web管理
  20. 临近算法knn(k-nearest neighbor)的计算

热门文章

  1. layui树形美化_使用layui-tree美化左侧菜单,点击生成tab选项
  2. iSCSI网络存储之IPSAN
  3. Mac安装Python并使用GUI界面设计
  4. java jsessionid_关于JSESSIONID
  5. 华为ax3怎么接光纤sc接口_华为AX3 pro获取原来路由器宽带账号和密码的操作步骤...
  6. 国务院正式发布《新一代人工智能发展规划》
  7. 暨反欺诈建模场景实操
  8. ap6212中串口蓝牙在linux下的使用记录
  9. 测试老鸟常用的自动化测试工具有哪些?
  10. as(四级考试频度很大的几个用法)