基础环境
系统版本
centos7.6
ip地址
# 可使用ifconfig查看 inet 对应的值即可
ifcongig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.21.70 netmask 255.255.192.0 broadcast 172.17.63.255
ether 00:16:3e:0a:ae:40 txqueuelen 1000 (Ethernet)
RX packets 26818 bytes 38644694 (36.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3048 bytes 313650 (306.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
一键安装
获取脚本
在线脚本
# 获取在线脚本
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/across/master/l2tp.sh
离线脚本
# 新建脚本文件,输入下列内容即可
touch l2tp.sh;
#!/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 VPN Auto Installer #
# Author: Teddysun <i@teddysun.com> #
# Intro: https://teddysun.com/448.html #
#=======================================================================#
cur_dir=`pwd`
libreswan_filename="libreswan-3.27"
download_root_url="https://dl.lamp.sh/files"
rootness(){
if [[ $EUID -ne 0 ]]; then
echo "Error:This script must be run as root!" 1>&2
exit 1
fi
}
tunavailable(){
if [[ ! -e /dev/net/tun ]]; then
echo "Error:TUN/TAP is not available!" 1>&2
exit 1
fi
}
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 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 )
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )
local 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=$1
local value=$2
local release=''
local systemPackage=''
if [[ -f /etc/redhat-release ]]; then
release="centos"
systemPackage="yum"
elif cat /etc/issue | grep -Eqi "debian"; then
release="debian"
systemPackage="apt"
elif cat /etc/issue | grep -Eqi "ubuntu"; then
release="ubuntu"
systemPackage="apt"
elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then
release="centos"
systemPackage="yum"
elif cat /proc/version | grep -Eqi "debian"; then
release="debian"
systemPackage="apt"
elif cat /proc/version | grep -Eqi "ubuntu"; then
release="ubuntu"
systemPackage="apt"
elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then
release="centos"
systemPackage="yum"
fi
if [[ ${checkType} == "sysRelease" ]]; then
if [ "$value" == "$release" ];then
return 0
else
return 1
fi
elif [[ ${checkType} == "packageManager" ]]; then
if [ "$value" == "$systemPackage" ];then
return 0
else
return 1
fi
fi
}
rand(){
index=0
str=""
for i in {a..z}; do arr[index]=${i}; index=`expr ${index} + 1`; done
for i in {A..Z}; do arr[index]=${i}; index=`expr ${index} + 1`; done
for i in {0..9}; do arr[index]=${i}; index=`expr ${index} + 1`; done
for i in {1..10}; do str="$str${arr[$RANDOM%$index]}"; done
echo ${str}
}
is_64bit(){
if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; then
return 0
else
return 1
fi
}
download_file(){
if [ -s ${1} ]; then
echo "$1 [found]"
else
echo "$1 not found!!!download now..."
if ! wget -c -t3 -T60 ${download_root_url}/${1}; then
echo "Failed to download $1, please download it to ${cur_dir} directory manually and try again."
exit 1
fi
fi
}
versionget(){
if [[ -s /etc/redhat-release ]];then
grep -oE "[0-9.]+" /etc/redhat-release
else
grep -oE "[0-9.]+" /etc/issue
fi
}
centosversion(){
if check_sys sysRelease centos;then
local code=${1}
local version="`versionget`"
local main_ver=${version%%.*}
if [ "${main_ver}" == "${code}" ];then
return 0
else
return 1
fi
else
return 1
fi
}
debianversion(){
if check_sys sysRelease debian;then
local version=$( get_opsy )
local code=${1}
local main_ver=$( echo ${version} | sed 's/[^0-9]//g')
if [ "${main_ver}" == "${code}" ];then
return 0
else
return 1
fi
else
return 1
fi
}
version_check(){
if check_sys packageManager yum; then
if centosversion 5; then
echo "Error: CentOS 5 is not supported, Please re-install OS and try again."
exit 1
fi
fi
}
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
}
preinstall_l2tp(){
echo
if [ -d "/proc/vz" ]; then
echo -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" ]; then
echo
echo "L2TP installation cancelled."
echo
exit 0
fi
fi
echo
echo "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}
echo
echo "ServerIP:${IP}"
echo "Server Local IP:${iprange}.1"
echo "Client Remote IP Range:${iprange}.2-${iprange}.254"
echo "PSK:${mypsk}"
echo
echo "Press any key to start... or press Ctrl + C to cancel."
char=`get_char`
}
install_l2tp(){
mknod /dev/random c 1 9
if check_sys packageManager apt; then
apt-get -y update
if debianversion 7; then
if is_64bit; then
local 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"
else
local 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"
fi
rm -rf ${cur_dir}/l2tp
mkdir -p ${cur_dir}/l2tp
cd ${cur_dir}/l2tp
download_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 iptables \
libcap-ng-utils libunbound-dev libevent-dev libcurl4-nss-dev libsystemd-daemon-dev
else
apt-get -y install wget gcc ppp flex bison make python libnss3-dev libnss3-tools libselinux-dev iptables \
libnspr4-dev pkg-config libpam0g-dev libcap-ng-dev libcap-ng-utils libunbound-dev \
libevent-dev libcurl4-nss-dev libsystemd-dev
fi
apt-get -y --no-install-recommends install xmlto
apt-get -y install xl2tpd
compile_install
elif check_sys packageManager yum; then
echo "Adding the EPEL repository..."
yum -y install epel-release yum-utils
[ ! -f /etc/yum.repos.d/epel.repo ] && echo "Install EPEL repository failed, please check it." && exit 1
yum-config-manager --enable epel
echo "Adding the EPEL repository complete..."
if centosversion 7; then
yum -y install ppp libreswan xl2tpd firewalld
yum_install
elif centosversion 6; then
yum -y remove libevent-devel
yum -y install libevent2-devel
yum -y install nss-devel nspr-devel pkgconfig pam-devel \
libcap-ng-devel libselinux-devel lsof \
curl-devel flex bison gcc ppp make iptables gmp-devel \
fipscheck-devel unbound-devel xmlto libpcap-devel xl2tpd
compile_install
fi
fi
}
config_install(){
cat > /etc/ipsec.conf<<EOF
version 2.0
config setup
protostack=netkey
nhelpers=0
uniqueids=no
interfaces=%defaultroute
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!${iprange}.0/24
conn l2tp-psk
rightsubnet=vhost:%priv
also=l2tp-psk-nonat
conn l2tp-psk-nonat
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=%defaultroute
leftid=${IP}
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
dpddelay=40
dpdtimeout=130
dpdaction=clear
sha2-truncbug=yes
EOF
cat > /etc/ipsec.secrets<<EOF
%any %any : PSK "${mypsk}"
EOF
cat > /etc/xl2tpd/xl2tpd.conf<<EOF
[global]
port = 1701
[lns default]
ip range = ${iprange}.2-${iprange}.254 local ip = ${iprange}.1 require chap = yes refuse pap = yes require authentication = yes name = l2tpd ppp debug = yes pppoptfile = /etc/ppp/options.xl2tpd length bit = yes EOF cat > /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 hide-password idle 1800 mtu 1410 mru 1410 nodefaultroute debug proxyarp connect-delay 5000 EOF rm -f /etc/ppp/chap-secrets cat > /etc/ppp/chap-secrets<<EOF # Secrets for authentication using CHAP # client server secret IP addresses ${username} l2tpd ${password} * EOF } compile_install(){ rm -rf ${cur_dir}/l2tp mkdir -p ${cur_dir}/l2tp cd ${cur_dir}/l2tp download_file “${libreswan_filename}.tar.gz” tar -zxf ${libreswan_filename}.tar.gz cd ${cur_dir}/l2tp/${libreswan_filename} cat > Makefile.inc.local <<‘EOF’ WERROR_CFLAGS = USE_DNSSEC = false USE_DH31 = false USE_GLIBC_KERN_FLIP_HEADERS = true EOF make programs && make install /usr/local/sbin/ipsec –version >/dev/null 2>&1 if [ $? -ne 0 ]; then echo “${libreswan_filename} install failed.” exit 1 fi config_install cp -pf /etc/sysctl.conf /etc/sysctl.conf.bak sed -i ‘s/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g’ /etc/sysctl.conf for each in `ls /proc/sys/net/ipv4/conf/`; do echo “net.ipv4.conf.${each}.accept_source_route=0” >> /etc/sysctl.conf echo “net.ipv4.conf.${each}.accept_redirects=0” >> /etc/sysctl.conf echo “net.ipv4.conf.${each}.send_redirects=0” >> /etc/sysctl.conf echo “net.ipv4.conf.${each}.rp_filter=0” >> /etc/sysctl.conf done sysctl -p if centosversion 6; then [ -f /etc/sysconfig/iptables ] && cp -pf /etc/sysconfig/iptables /etc/sysconfig/iptables.old.`date +%Y%m%d` if [ “`iptables -L -n | grep -c ‘\-\-‘`” == “0” ]; then cat > /etc/sysconfig/iptables <<EOF # Added by L2TP VPN 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 EOF else iptables -I INPUT -p udp -m multiport –dports 500,4500,1701 -j ACCEPT iptables -I FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT iptables -I FORWARD -s ${iprange}.0/24 -j ACCEPT iptables -t nat -A POSTROUTING -s ${iprange}.0/24 -j SNAT –to-source ${IP} /etc/init.d/iptables save fi if [ ! -f /etc/ipsec.d/cert9.db ]; then echo > /var/tmp/libreswan-nss-pwd certutil -N -f /var/tmp/libreswan-nss-pwd -d /etc/ipsec.d rm -f /var/tmp/libreswan-nss-pwd fi chkconfig –add iptables chkconfig iptables on chkconfig –add ipsec chkconfig ipsec on chkconfig –add xl2tpd chkconfig xl2tpd on /etc/init.d/iptables restart /etc/init.d/ipsec start /etc/init.d/xl2tpd start else [ -f /etc/iptables.rules ] && cp -pf /etc/iptables.rules /etc/iptables.rules.old.`date +%Y%m%d` if [ “`iptables -L -n | grep -c ‘\-\-‘`” == “0” ]; then cat > /etc/iptables.rules <<EOF # Added by L2TP VPN 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 EOF else iptables -I INPUT -p udp -m multiport –dports 500,4500,1701 -j ACCEPT iptables -I FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT iptables -I FORWARD -s ${iprange}.0/24 -j ACCEPT iptables -t nat -A POSTROUTING -s ${iprange}.0/24 -j SNAT –to-source ${IP} /sbin/iptables-save > /etc/iptables.rules fi cat > /etc/network/if-up.d/iptables <<EOF #!/bin/sh /sbin/iptables-restore < /etc/iptables.rules EOF chmod +x /etc/network/if-up.d/iptables if [ ! -f /etc/ipsec.d/cert9.db ]; then echo > /var/tmp/libreswan-nss-pwd certutil -N -f /var/tmp/libreswan-nss-pwd -d /etc/ipsec.d rm -f /var/tmp/libreswan-nss-pwd fi update-rc.d -f xl2tpd defaults cp -f /etc/rc.local /etc/rc.local.old.`date +%Y%m%d` sed –follow-symlinks -i -e ‘/^exit 0/d’ /etc/rc.local cat >> /etc/rc.local <<EOF # Added by L2TP VPN script echo 1 > /proc/sys/net/ipv4/ip_forward /usr/sbin/service ipsec start exit 0 EOF chmod +x /etc/rc.local echo 1 > /proc/sys/net/ipv4/ip_forward /sbin/iptables-restore < /etc/iptables.rules /usr/sbin/service ipsec start /usr/sbin/service xl2tpd restart fi } yum_install(){ config_install cp -pf /etc/sysctl.conf /etc/sysctl.conf.bak echo “# Added by L2TP VPN” >> /etc/sysctl.conf echo “net.ipv4.ip_forward=1” >> /etc/sysctl.conf echo “net.ipv4.tcp_syncookies=1” >> /etc/sysctl.conf echo “net.ipv4.icmp_echo_ignore_broadcasts=1” >> /etc/sysctl.conf echo “net.ipv4.icmp_ignore_bogus_error_responses=1” >> /etc/sysctl.conf for each in `ls /proc/sys/net/ipv4/conf/`; do echo “net.ipv4.conf.${each}.accept_source_route=0” >> /etc/sysctl.conf echo “net.ipv4.conf.${each}.accept_redirects=0” >> /etc/sysctl.conf echo “net.ipv4.conf.${each}.send_redirects=0” >> /etc/sysctl.conf echo “net.ipv4.conf.${each}.rp_filter=0″ >> /etc/sysctl.conf done sysctl -p cat > /etc/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> EOF chmod 640 /etc/firewalld/services/xl2tpd.xml systemctl enable ipsec systemctl enable xl2tpd systemctl enable firewalld systemctl status firewalld > /dev/null 2>&1 if [ $? -eq 0 ]; then firewall-cmd –reload echo “Checking firewalld status…” firewall-cmd –list-all echo “add firewalld rules…” firewall-cmd –permanent –add-service=ipsec firewall-cmd –permanent –add-service=xl2tpd firewall-cmd –permanent –add-masquerade firewall-cmd –reload else echo “Firewalld looks like not running, trying to start…” systemctl start firewalld if [ $? -eq 0 ]; then echo “Firewalld start successfully…” firewall-cmd –reload echo “Checking firewalld status…” firewall-cmd –list-all echo “adding firewalld rules…” firewall-cmd –permanent –add-service=ipsec firewall-cmd –permanent –add-service=xl2tpd firewall-cmd –permanent –add-masquerade firewall-cmd –reload else echo “Failed to start firewalld. please enable udp port 500 4500 1701 manually if necessary.” fi fi systemctl restart ipsec systemctl restart xl2tpd echo “Checking ipsec status…” systemctl -a | grep ipsec echo “Checking xl2tpd status…” systemctl -a | grep xl2tpd echo “Checking firewalld status…” firewall-cmd –list-all } finally(){ cd ${cur_dir} rm -fr ${cur_dir}/l2tp # create l2tp command cp -f ${cur_dir}/`basename $0` /usr/bin/l2tp echo “Please wait a moment…” sleep 5 ipsec verify echo echo “###############################################################” echo “# L2TP VPN 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 “VPN Server with the default Username/Password is below:” echo echo “Server IP: ${IP}” echo “PSK : ${mypsk}” echo “Username : ${username}” echo “Password : ${password}” echo echo “If you want to modify user settings, please use below 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)” echo echo “Welcome to visit our website: https://teddysun.com/448.html” echo “Enjoy it!” echo } l2tp(){ clear echo echo “###############################################################” echo “# L2TP VPN 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 rootness tunavailable disable_selinux version_check get_os_info preinstall_l2tp install_l2tp finally } list_users(){ if [ ! -f /etc/ppp/chap-secrets ];then echo “Error: /etc/ppp/chap-secrets file not found.” exit 1 fi local line=”+——————————————-+\n” local string=%20s printf “${line}|${string} |${string} |\n${line}” Username Password grep -v “^#” /etc/ppp/chap-secrets | awk ‘{printf “|’${string}’ |’${string}’ |\n”, $1,$3}’ printf ${line} } add_user(){ while : do read -p “Please input your Username:” user if [ -z ${user} ]; then echo “Username can not be empty” else grep -w “${user}” /etc/ppp/chap-secrets > /dev/null 2>&1 if [ $? -eq 0 ];then echo “Username (${user}) already exists. Please re-enter your username.” else break fi fi done pass=`rand` echo “Please input ${user}’s password:” read -p “(Default Password: ${pass}):” tmppass [ ! -z ${tmppass} ] && pass=${tmppass} echo “${user} l2tpd ${pass} *” >> /etc/ppp/chap-secrets echo “Username (${user}) add completed.” } del_user(){ while : do read -p “Please input Username you want to delete it:” user if [ -z ${user} ]; then echo “Username can not be empty” else grep -w “${user}” /etc/ppp/chap-secrets >/dev/null 2>&1 if [ $? -eq 0 ];then break else echo “Username (${user}) is not exists. Please re-enter your username.” fi fi done sed -i “/^\<${user}\>/d” /etc/ppp/chap-secrets echo “Username (${user}) delete completed.” } mod_user(){ while : do read -p “Please input Username you want to change password:” user if [ -z ${user} ]; then echo “Username can not be empty” else grep -w “${user}” /etc/ppp/chap-secrets >/dev/null 2>&1 if [ $? -eq 0 ];then break else echo “Username (${user}) is not exists. Please re-enter your username.” fi fi done pass=`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-secrets echo “${user} l2tpd ${pass} *” >> /etc/ppp/chap-secrets echo “Username ${user}’s password has been changed.” } # Main process action=$1 if [ -z ${action} ] && [ “`basename $0`” != “l2tp” ]; then action=install fi case ${action} in install) l2tp 2>&1 | tee ${cur_dir}/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
执行脚本
# 赋予脚本执行权限
chmod +x l2tp.sh
# 执行脚本(若非root用户,需要使用sudo ./l2tp.sh 执行)
./l2tp.sh
# 脚本执行完毕后会出现下列界面,此处输入基础环境中ip地址对应的范围段即可,此处为:172.17.21
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键
# 等待安装结果即可
基础命令
# 新增用户
l2tp -a
# 删除用户
l2tp -d
# 修改现有的用户的密码
l2tp -m
# 列出所有用户名和密码
l2tp -l
# 列出帮助信息
l2tp -h
# 查看 ipsec 运行状态
ipsec status
# 启动 ipsec
ipsec start
# 停止 ipsec
ipsec stop
# 重启 ipsec
ipsec restart
# ipsec 简介:https://baike.baidu.com/item/IPSec/2472311
开放UDP端口
# 放行500、4500端口
配置 IPsec/L2TP VPN 客户端
Windows
你也可以使用 IKEv2 模式连接(推荐)。
Windows 11
- 右键单击系统托盘中的无线/网络图标。
- 选择 网络和 Internet 设置,然后在打开的页面中单击 VPN。
- 单击 添加 VPN 按钮。
- 从 VPN 提供商 下拉菜单选择 Windows (内置)。
- 在 连接名称 字段中输入任意内容。
- 在 服务器名称或地址 字段中输入
你的 VPN 服务器 IP
。 - 从 VPN 类型 下拉菜单选择 使用预共享密钥的 L2TP/IPsec。
- 在 预共享密钥 字段中输入
你的 VPN IPsec PSK
。 - 在 用户名 字段中输入
你的 VPN 用户名
。 - 在 密码 字段中输入
你的 VPN 密码
。 - 选中 记住我的登录信息 复选框。
- 单击 保存 保存 VPN 连接的详细信息。
注: 在首次连接之前需要修改一次注册表,以解决 VPN 服务器 和/或 客户端与 NAT (比如家用路由器)的兼容问题。
要连接到 VPN:单击 连接 按钮,或者单击系统托盘中的无线/网络图标,单击 VPN,然后选择新的 VPN 连接并单击 连接。如果出现提示,在登录窗口中输入 你的 VPN 用户名
和 密码
,并单击 确定。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP
。
如果在连接过程中遇到错误,请参见 故障排除。
Windows 10 and 8
- 右键单击系统托盘中的无线/网络图标。
- 选择 打开”网络和 Internet”设置,然后在打开的页面中单击 网络和共享中心。
- 单击 设置新的连接或网络。
- 选择 连接到工作区,然后单击 下一步。
- 单击 使用我的Internet连接 (VPN)。
- 在 Internet地址 字段中输入
你的 VPN 服务器 IP
。 - 在 目标名称 字段中输入任意内容。单击 创建。
- 返回 网络和共享中心。单击左侧的 更改适配器设置。
- 右键单击新创建的 VPN 连接,并选择 属性。
- 单击 安全 选项卡,从 VPN 类型 下拉菜单中选择 “使用 IPsec 的第 2 层隧道协议 (L2TP/IPSec)”。
- 单击 允许使用这些协议。选中 “质询握手身份验证协议 (CHAP)” 和 “Microsoft CHAP 版本 2 (MS-CHAP v2)” 复选框。
- 单击 高级设置 按钮。
- 单击 使用预共享密钥作身份验证 并在 密钥 字段中输入
你的 VPN IPsec PSK
。 - 单击 确定 关闭 高级设置。
- 单击 确定 保存 VPN 连接的详细信息。
注: 在首次连接之前需要修改一次注册表,以解决 VPN 服务器 和/或 客户端与 NAT (比如家用路由器)的兼容问题。
要连接到 VPN:单击系统托盘中的无线/网络图标,选择新的 VPN 连接,然后单击 连接。如果出现提示,在登录窗口中输入 你的 VPN 用户名
和 密码
,并单击 确定。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP
。
如果在连接过程中遇到错误,请参见 故障排除。
另外,除了按照以上步骤操作,你也可以运行下面的 Windows PowerShell 命令来创建 VPN 连接。将 你的 VPN 服务器 IP
和 你的 VPN IPsec PSK
换成你自己的值,用单引号括起来:
# 不保存命令行历史记录
Set-PSReadlineOption –HistorySaveStyle SaveNothing
# 创建 VPN 连接
Add-VpnConnection -Name 'My IPsec VPN' -ServerAddress '你的 VPN 服务器 IP' `
-L2tpPsk '你的 VPN IPsec PSK' -TunnelType L2tp -EncryptionLevel Required `
-AuthenticationMethod Chap,MSChapv2 -Force -RememberCredential -PassThru
# 忽略 data encryption 警告(数据在 IPsec 隧道中已被加密)
Windows 7, Vista and XP
- 单击开始菜单,选择控制面板。
- 进入 网络和Internet 部分。
- 单击 网络和共享中心。
- 单击 设置新的连接或网络。
- 选择 连接到工作区,然后单击 下一步。
- 单击 使用我的Internet连接 (VPN)。
- 在 Internet地址 字段中输入
你的 VPN 服务器 IP
。 - 在 目标名称 字段中输入任意内容。
- 选中 现在不连接;仅进行设置以便稍后连接 复选框。
- 单击 下一步。
- 在 用户名 字段中输入
你的 VPN 用户名
。 - 在 密码 字段中输入
你的 VPN 密码
。 - 选中 记住此密码 复选框。
- 单击 创建,然后单击 关闭 按钮。
- 返回 网络和共享中心。单击左侧的 更改适配器设置。
- 右键单击新创建的 VPN 连接,并选择 属性。
- 单击 选项 选项卡,取消选中 包括Windows登录域 复选框。
- 单击 安全 选项卡,从 VPN 类型 下拉菜单中选择 “使用 IPsec 的第 2 层隧道协议 (L2TP/IPSec)”。
- 单击 允许使用这些协议。选中 “质询握手身份验证协议 (CHAP)” 和 “Microsoft CHAP 版本 2 (MS-CHAP v2)” 复选框。
- 单击 高级设置 按钮。
- 单击 使用预共享密钥作身份验证 并在 密钥 字段中输入
你的 VPN IPsec PSK
。 - 单击 确定 关闭 高级设置。
- 单击 确定 保存 VPN 连接的详细信息。
注: 在首次连接之前需要修改一次注册表,以解决 VPN 服务器 和/或 客户端与 NAT (比如家用路由器)的兼容问题。
要连接到 VPN:单击系统托盘中的无线/网络图标,选择新的 VPN 连接,然后单击 连接。如果出现提示,在登录窗口中输入 你的 VPN 用户名
和 密码
,并单击 确定。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP
。
如果在连接过程中遇到错误,请参见 故障排除。
OS X
你也可以使用 IKEv2(推荐)或者 IPsec/XAuth 模式连接。
- 打开系统偏好设置并转到网络部分。
- 在窗口左下角单击 + 按钮。
- 从 接口 下拉菜单选择 VPN。
- 从 VPN类型 下拉菜单选择 IPSec 上的 L2TP。
- 在 服务名称 字段中输入任意内容。
- 单击 创建。
- 在 服务器地址 字段中输入
你的 VPN 服务器 IP
。 - 在 帐户名称 字段中输入
你的 VPN 用户名
。 - 单击 认证设置 按钮。
- 在 用户认证 部分,选择 密码 单选按钮,然后输入
你的 VPN 密码
。 - 在 机器认证 部分,选择 共享的密钥 单选按钮,然后输入
你的 VPN IPsec PSK
。 - 保持 群组名称 字段空白。
- 单击 好。
- 选中 在菜单栏中显示 VPN 状态 复选框。
- (重要) 单击 高级 按钮,并选中 通过VPN连接发送所有通信 复选框。
- (重要) 单击 TCP/IP 选项卡,并在 配置IPv6 部分中选择 仅本地链接。
- 单击 好 关闭高级设置,然后单击 应用 保存VPN连接信息。
要连接到 VPN:使用菜单栏中的图标,或者打开系统偏好设置的网络部分,选择 VPN 并单击 连接。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP
。
如果在连接过程中遇到错误,请参见 故障排除。
Android
重要: Android 用户应该使用更安全的 IKEv2 模式 连接(推荐)。Android 12+ 仅支持 IKEv2 模式。Android 系统自带的 VPN 客户端对 IPsec/L2TP 和 IPsec/XAuth (“Cisco IPsec”) 模式使用安全性较低的 modp1024
(DH group 2)。
如果你仍然想用 IPsec/L2TP 模式连接,你必须首先编辑 VPN 服务器上的 /etc/ipsec.conf
并在 ike=...
一行的末尾加上 ,aes256-sha2;modp1024,aes128-sha1;modp1024
字样。保存文件并运行 sudo service ipsec restart
。
Docker 用户:在 你的 env 文件 中添加 VPN_ENABLE_MODP1024=yes
,然后重新创建 Docker 容器。
然后在你的 Android 设备上进行以下步骤:
- 启动 设置 应用程序。
- 单击 网络和互联网。或者,如果你使用 Android 7 或更早版本,在 无线和网络 部分单击 更多…。
- 单击 VPN。
- 单击 添加VPN配置文件 或窗口右上角的 +。
- 在 名称 字段中输入任意内容。
- 在 类型 下拉菜单选择 L2TP/IPSec PSK。
- 在 服务器地址 字段中输入
你的 VPN 服务器 IP
。 - 保持 L2TP 密钥 字段空白。
- 保持 IPSec 标识符 字段空白。
- 在 IPSec 预共享密钥 字段中输入
你的 VPN IPsec PSK
。 - 单击 保存。
- 单击新的VPN连接。
- 在 用户名 字段中输入
你的 VPN 用户名
。 - 在 密码 字段中输入
你的 VPN 密码
。 - 选中 保存帐户信息 复选框。
- 单击 连接。
连接成功后,会在通知栏显示图标。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP
。
如果在连接过程中遇到错误,请参见 故障排除。
iOS
你也可以使用 IKEv2(推荐)或者 IPsec/XAuth 模式连接。
- 进入设置 -> 通用 -> VPN。
- 单击 添加VPN配置…。
- 单击 类型 。选择 L2TP 并返回。
- 在 描述 字段中输入任意内容。
- 在 服务器 字段中输入
你的 VPN 服务器 IP
。 - 在 帐户 字段中输入
你的 VPN 用户名
。 - 在 密码 字段中输入
你的 VPN 密码
。 - 在 密钥 字段中输入
你的 VPN IPsec PSK
。 - 启用 发送所有流量 选项。
- 单击右上角的 完成。
- 启用 VPN 连接。
连接成功后,会在通知栏显示图标。最后你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP
。
如果在连接过程中遇到错误,请参见 故障排除。
Chrome OS
你也可以使用 IKEv2 模式连接(推荐)。
- 进入设置 -> 网络。
- 单击 添加连接,然后单击 添加内置 VPN。
- 在 服务名称 字段中输入任意内容。
- 在 提供商类型 下拉菜单选择 L2TP/IPsec。
- 在 服务器主机名 字段中输入
你的 VPN 服务器 IP
。 - 在 身份验证类型 下拉菜单选择 预共享密钥。
- 在 用户名 字段中输入
你的 VPN 用户名
。 - 在 密码 字段中输入
你的 VPN 密码
。 - 在 预共享密钥 字段中输入
你的 VPN IPsec PSK
。 - 保持其他字段空白。
- 启用 保存身份信息和密码。
- 单击 连接。
连接成功后,网络状态图标上会出现 VPN 指示。你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP
。
如果在连接过程中遇到错误,请参见 故障排除。
Linux
你也可以使用 IKEv2 模式连接(推荐)。
Ubuntu Linux
Ubuntu 18.04 和更新版本用户可以使用 apt
安装 network-manager-l2tp-gnome 软件包,然后通过 GUI 配置 IPsec/L2TP VPN 客户端。
- 进入 Settings -> Network -> VPN。单击 + 按钮。
- 选择 Layer 2 Tunneling Protocol (L2TP)。
- 在 Name 字段中输入任意内容。
- 在 Gateway 字段中输入
你的 VPN 服务器 IP
。 - 在 User name 字段中输入
你的 VPN 用户名
。 - 右键单击 Password 字段中的 ?,选择 Store the password only for this user。
- 在 Password 字段中输入
你的 VPN 密码
。 - 保持 NT Domain 字段空白。
- 单击 IPsec Settings… 按钮。
- 选中 Enable IPsec tunnel to L2TP host 复选框。
- 保持 Gateway ID 字段空白。
- 在 Pre-shared key 字段中输入
你的 VPN IPsec PSK
。 - 展开 Advanced 部分。
- 在 Phase1 Algorithms 字段中输入
aes128-sha1-modp2048
。 - 在 Phase2 Algorithms 字段中输入
aes128-sha1
。 - 单击 OK,然后单击 Add 保存 VPN 连接信息。
- 启用 VPN 连接。
如果在连接过程中遇到错误,请尝试 这个解决方案。
连接成功后,你可以到 这里 检测你的 IP 地址,应该显示为你的 VPN 服务器 IP
。
Fedora 和 CentOS
Fedora 28(和更新版本)和 CentOS 8/7 用户可以使用 IPsec/XAuth 模式连接。
其它 Linux
首先看 这里 以确认 network-manager-l2tp
和 network-manager-l2tp-gnome
软件包是否在你的 Linux 版本上可用。如果可用,安装它们(选择使用 strongSwan)并参见上面的说明。另外,你也可以使用命令行配置 Linux VPN 客户端。
使用命令行配置 Linux VPN 客户端
高级用户可以使用命令行配置 Linux VPN 客户端。另外,你也可以使用 IKEv2 模式连接(推荐),或者 使用图形界面配置。以下说明受到 Peter Sanford 的工作 的启发。这些命令必须在你的 VPN 客户端上使用 root
账户运行。
要配置 VPN 客户端,首先安装以下软件包:
# Ubuntu and Debian
apt-get update
apt-get install strongswan xl2tpd net-tools
# Fedora
yum install strongswan xl2tpd net-tools
# CentOS
yum install epel-release
yum --enablerepo=epel install strongswan xl2tpd net-tools
创建 VPN 变量(替换为你自己的值):
VPN_SERVER_IP='你的VPN服务器IP'
VPN_IPSEC_PSK='你的IPsec预共享密钥'
VPN_USER='你的VPN用户名'
VPN_PASSWORD='你的VPN密码'
配置 strongSwan:
cat > /etc/ipsec.conf <<EOF
# ipsec.conf - strongSwan IPsec configuration file
conn myvpn
auto=add
keyexchange=ikev1
authby=secret
type=transport
left=%defaultroute
leftprotoport=17/1701
rightprotoport=17/1701
right=$VPN_SERVER_IP
ike=aes128-sha1-modp2048
esp=aes128-sha1
EOF
cat > /etc/ipsec.secrets <<EOF
: PSK "$VPN_IPSEC_PSK"
EOF
chmod 600 /etc/ipsec.secrets
# For CentOS and Fedora ONLY
mv /etc/strongswan/ipsec.conf /etc/strongswan/ipsec.conf.old 2>/dev/null
mv /etc/strongswan/ipsec.secrets /etc/strongswan/ipsec.secrets.old 2>/dev/null
ln -s /etc/ipsec.conf /etc/strongswan/ipsec.conf
ln -s /etc/ipsec.secrets /etc/strongswan/ipsec.secrets
配置 xl2tpd:
cat > /etc/xl2tpd/xl2tpd.conf <<EOF
[lac myvpn]
lns = $VPN_SERVER_IP ppp debug = yes pppoptfile = /etc/ppp/options.l2tpd.client length bit = yes EOF cat > /etc/ppp/options.l2tpd.client <<EOF ipcp-accept-local ipcp-accept-remote refuse-eap require-chap noccp noauth mtu 1280 mru 1280 noipdefault defaultroute usepeerdns connect-delay 5000 name “$VPN_USER” password “$VPN_PASSWORD” EOF chmod 600 /etc/ppp/options.l2tpd.client
至此 VPN 客户端配置已完成。按照下面的步骤进行连接。
注: 当你每次尝试连接到 VPN 时,必须重复下面的所有步骤。
创建 xl2tpd 控制文件:
mkdir -p /var/run/xl2tpd
touch /var/run/xl2tpd/l2tp-control
重启服务:
service strongswan restart
# 适用于 Ubuntu 20.04,如果 strongswan 服务不存在
ipsec restart
service xl2tpd restart
开始 IPsec 连接:
# Ubuntu and Debian
ipsec up myvpn
# CentOS and Fedora
strongswan up myvpn
开始 L2TP 连接:
echo "c myvpn" > /var/run/xl2tpd/l2tp-control
运行 ifconfig
并且检查输出。现在你应该看到一个新的网络接口 ppp0
。
检查你现有的默认路由:
ip route
在输出中查找以下行: default via X.X.X.X ...
。记下这个网关 IP,并且在下面的两个命令中使用。
从新的默认路由中排除你的 VPN 服务器的公有 IP(替换为你自己的值):
route add 你的VPN服务器的公有IP gw X.X.X.X
如果你的 VPN 客户端是一个远程服务器,则必须从新的默认路由中排除你的本地电脑的公有 IP,以避免 SSH 会话被断开 (替换为实际值):
route add 你的本地电脑的公有IP gw X.X.X.X
添加一个新的默认路由,并且开始通过 VPN 服务器发送数据:
route add default dev ppp0
至此 VPN 连接已成功完成。检查 VPN 是否正常工作:
wget -qO- http://ipv4.icanhazip.com; echo
以上命令应该返回 你的 VPN 服务器 IP
。
要停止通过 VPN 服务器发送数据:
route del default dev ppp0
要断开连接:
# Ubuntu and Debian
echo "d myvpn" > /var/run/xl2tpd/l2tp-control
ipsec down myvpn
# CentOS and Fedora
echo "d myvpn" > /var/run/xl2tpd/l2tp-control
strongswan down myvpn
IKEv1 故障排除
另见: IKEv2 故障排除 和 高级用法。
- 检查日志及 VPN 状态
- Windows 错误 809
- Windows 错误 789 或 691
- Windows 错误 628 或 766
- Windows 10 正在连接
- Windows 10 升级
- Windows DNS 泄漏和 IPv6
- Android MTU/MSS 问题
- Android 6 和 7
- macOS 通过 VPN 发送通信
- iOS 13+ 和 macOS 10.15/11+
- iOS/Android 睡眠模式
- Debian 11/10 内核
- 其它错误
检查日志及 VPN 状态
以下命令需要使用 root
账户(或者 sudo
)运行。
首先,重启 VPN 服务器上的相关服务:
service ipsec restart
service xl2tpd restart
Docker 用户: 运行 docker restart ipsec-vpn-server
。
然后重启你的 VPN 客户端设备,并重试连接。如果仍然无法连接,可以尝试删除并重新创建 VPN 连接。请确保输入了正确的 VPN 服务器地址和 VPN 登录凭证。
对于有外部防火墙的服务器(比如 EC2/GCE),请为 VPN 打开 UDP 端口 500 和 4500。
检查 Libreswan (IPsec) 和 xl2tpd 日志是否有错误:
# Ubuntu & Debian
grep pluto /var/log/auth.log
grep xl2tpd /var/log/syslog
# CentOS/RHEL, Rocky Linux, AlmaLinux, Oracle Linux & Amazon Linux 2
grep pluto /var/log/secure
grep xl2tpd /var/log/messages
# Alpine Linux
grep pluto /var/log/messages
grep xl2tpd /var/log/messages
检查 IPsec VPN 服务器状态:
ipsec status
查看当前已建立的 VPN 连接:
ipsec trafficstatus
Windows 错误 809
错误 809:无法建立计算机与 VPN 服务器之间的网络连接,因为远程服务器未响应。这可能是因为未将计算机与远程服务器之间的某种网络设备(如防火墙、NAT、路由器等)配置为允许 VPN 连接。请与管理员或服务提供商联系以确定哪种设备可能产生此问题。
注: 仅当你使用 IPsec/L2TP 模式连接到 VPN 时,才需要进行下面的注册表更改。对于 IKEv2 和 IPsec/XAuth 模式,不需要 进行此更改。
要解决此错误,在首次连接之前需要修改一次注册表,以解决 VPN 服务器 和/或 客户端与 NAT (比如家用路由器)的兼容问题。请下载并导入下面的 .reg
文件,或者打开 提升权限命令提示符 并运行以下命令。完成后必须重启计算机。
- 适用于 Windows Vista, 7, 8, 10 和 11 (下载 .reg 文件)
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f
- 仅适用于 Windows XP (下载 .reg 文件)
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\IPSec /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f
另外,某些个别的 Windows 系统配置禁用了 IPsec 加密,此时也会导致连接失败。要重新启用它,可以运行以下命令并重启。
- 适用于 Windows XP, Vista, 7, 8, 10 和 11 (下载 .reg 文件)
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\RasMan\Parameters /v ProhibitIpSec /t REG_DWORD /d 0x0 /f
Windows 错误 789 或 691
错误 789:L2TP 连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误。
错误 691:由于指定的用户名和/或密码无效而拒绝连接。下列条件可能会导致此情况:用户名和/或密码键入错误…
对于错误 789,点击 这里 查看故障排除信息。对于错误 691,你可以尝试删除并重新创建 VPN 连接,按照本文档中的步骤操作。请确保输入了正确的 VPN 登录凭证。
Windows 错误 628 或 766
错误 628:在连接完成前,连接被远程计算机终止。
错误 766:找不到证书。使用通过 IPSec 的 L2TP 协议的连接要求安装一个机器证书。它也叫做计算机证书。
要解决这些错误,请按以下步骤操作:
- 右键单击系统托盘中的无线/网络图标。
- 选择 打开网络和共享中心。或者,如果你使用 Windows 10 版本 1709 或以上,选择 打开”网络和 Internet”设置,然后在打开的页面中单击 网络和共享中心。
- 单击左侧的 更改适配器设置。右键单击新的 VPN 连接,并选择 属性。
- 单击 安全 选项卡,从 VPN 类型 下拉菜单中选择 “使用 IPsec 的第 2 层隧道协议 (L2TP/IPSec)”。
- 单击 允许使用这些协议。选中 “质询握手身份验证协议 (CHAP)” 和 “Microsoft CHAP 版本 2 (MS-CHAP v2)” 复选框。
- 单击 高级设置 按钮。
- 单击 使用预共享密钥作身份验证 并在 密钥 字段中输入
你的 VPN IPsec PSK
。 - 单击 确定 关闭 高级设置。
- 单击 确定 保存 VPN 连接的详细信息。
请参见 VPN 连接属性对话框的屏幕截图。
Windows 10 正在连接
如果你使用 Windows 10 并且 VPN 卡在 “正在连接” 状态超过几分钟,尝试以下步骤:
- 右键单击系统托盘中的无线/网络图标。
- 选择 打开”网络和 Internet”设置,然后在打开的页面中单击左侧的 VPN。
- 选择新的 VPN 连接,然后单击 连接。如果出现提示,在登录窗口中输入
你的 VPN 用户名
和密码
,并单击 确定。
Windows 10 升级
在升级 Windows 10 版本之后 (比如从 1709 到 1803),你可能需要重新按照上面的 Windows 错误 809 中的步骤修改注册表并重启。
Windows DNS 泄漏和 IPv6
Windows 8, 10 和 11 默认使用 “smart multi-homed name resolution” (智能多宿主名称解析)。如果你的因特网适配器的 DNS 服务器在本地网段上,在使用 Windows 自带的 IPsec VPN 客户端时可能会导致 “DNS 泄漏”。要解决这个问题,你可以 禁用智能多宿主名称解析,或者配置你的因特网适配器以使用在你的本地网段之外的 DNS 服务器(比如 8.8.8.8 和 8.8.4.4)。在完成后清除 DNS 缓存并且重启计算机。
另外,如果你的计算机启用了 IPv6,所有的 IPv6 流量(包括 DNS 请求)都将绕过 VPN。要在 Windows 上禁用 IPv6,请看这里。如果你需要支持 IPv6 的 VPN,可以另外尝试 OpenVPN。
Android MTU/MSS 问题
某些 Android 设备有 MTU/MSS 问题,表现为使用 IPsec/XAuth (“Cisco IPsec”) 模式可以连接到 VPN 但是无法打开网站。如果你遇到该问题,尝试在 VPN 服务器上运行以下命令。如果成功解决,你可以将这些命令添加到 /etc/rc.local
以使它们重启后继续有效。
iptables -t mangle -A FORWARD -m policy --pol ipsec --dir in \
-p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 \
-j TCPMSS --set-mss 1360
iptables -t mangle -A FORWARD -m policy --pol ipsec --dir out \
-p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 \
-j TCPMSS --set-mss 1360
echo 1 > /proc/sys/net/ipv4/ip_no_pmtu_disc
Docker 用户: 要修复这个问题,不需要运行以上命令。你可以在你的 env 文件中添加 VPN_ANDROID_MTU_FIX=yes
,然后重新创建 Docker 容器。
参考链接:[1]。
Android 6 和 7
如果你的 Android 6.x 或者 7.x 设备无法连接,请尝试以下步骤:
- 单击 VPN 连接旁边的设置按钮,选择 “Show advanced options” 并且滚动到底部。如果选项 “Backward compatible mode” 存在(参见屏幕截图),请启用它并重试连接。如果不存在,请尝试下一步。
- 编辑 VPN 服务器上的
/etc/ipsec.conf
。找到sha2-truncbug
一行并切换它的值。也就是说,将sha2-truncbug=no
替换为sha2-truncbug=yes
,或者将sha2-truncbug=yes
替换为sha2-truncbug=no
。保存修改并运行service ipsec restart
。然后重新连接 VPN。
Docker 用户: 如需在 /etc/ipsec.conf
中设置 sha2-truncbug=yes
(默认为 no
),你可以在你的 env 文件中添加 VPN_SHA2_TRUNCBUG=yes
,然后重新创建 Docker 容器。
macOS 通过 VPN 发送通信
OS X (macOS) 用户: 如果可以成功地使用 IPsec/L2TP 模式连接,但是你的公有 IP 没有显示为 你的 VPN 服务器 IP
,请阅读上面的 OS X 部分并完成以下步骤。保存 VPN 配置然后重新连接。
- 单击 高级 按钮,并选中 通过VPN连接发送所有通信 复选框。
- 单击 TCP/IP 选项卡,并在 配置IPv6 部分中选择 仅本地链接。
如果在尝试上面步骤之后,你的计算机仍然不能通过 VPN 连接发送通信,检查一下服务顺序。进入系统偏好设置中的网络部分,单击左侧连接列表下方的齿轮按钮,选择 “设定服务顺序”。然后将 VPN 连接拖动到顶端。
iOS 13+ 和 macOS 10.15/11+
如果你的设备运行 iOS 13+, macOS 10.15 (Catalina), macOS 11 (Big Sur) 或以上版本,并且无法连接到 VPN,请尝试以下步骤:编辑 VPN 服务器上的 /etc/ipsec.conf
。找到 sha2-truncbug=yes
并将它替换为 sha2-truncbug=no
。保存修改并运行 service ipsec restart
。然后重新连接 VPN。
另外,macOS Big Sur 11.0 用户应该更新到版本 11.1 或以上,以修复 VPN 连接的某些问题。要检查 macOS 版本并安装更新,请看这里。
iOS/Android 睡眠模式
为了节约电池,iOS 设备 (iPhone/iPad) 在屏幕变黑(睡眠模式)之后不久就会自动断开 Wi-Fi 连接。这会导致 IPsec VPN 断开。该行为是被 故意设计的 并且不能被配置。
如果需要 VPN 在设备唤醒后自动重连,你可以使用 IKEv2 模式连接(推荐)并启用 “VPN On Demand” 功能。或者你也可以另外尝试使用 OpenVPN,它支持 一些选项 比如 “Reconnect on Wakeup” 和 “Seamless Tunnel”。
Android 设备在进入睡眠模式不久后也会断开 Wi-Fi 连接,如果你没有启用选项 “睡眠期间保持 WLAN 开启” 的话。该选项在 Android 8 (Oreo) 和更新版本中不再可用。另外,你也可以尝试打开 “始终开启 VPN” 选项以保持连接。详情请看 这里。
Debian 11/10 内核
Debian 11 或者 10 用户:运行 uname -r
检查你的服务器的 Linux 内核版本。如果它包含 cloud
字样,并且 /dev/ppp
不存在,则该内核缺少 ppp
支持从而不能使用 IPsec/L2TP 模式。VPN 安装脚本会尝试检测此情形并显示警告。在这种情况下,你可以另外使用 IKEv2 或者 IPsec/XAuth 模式连接到 VPN。
要解决 IPsec/L2TP 模式的问题,你可以换用标准的 Linux 内核,通过安装比如 linux-image-amd64
软件包来实现。然后更新 GRUB 的内核默认值并重启服务器。
其它错误
如果你遇到其它错误,请参见以下链接:
- http://www.tp-link.com/en/faq-1029.html
- https://documentation.meraki.com/MX-Z/Client_VPN/Troubleshooting_Client_VPN#Common_Connection_Issues
- https://stackoverflow.com/questions/25245854/windows-8-1-gets-error-720-on-connect-vpn