在Ubuntu上配置L2TP/IPsec VPN


之前在工作的时候就被安排了一个任务是配置VPN,但是当时弄了一阵之后发现连接总是会出现问题(可以连上,但一访问外网,过一会儿就断线了o(╯□╰)o当时也没有测试手机连接VPN,现在搭建的这个我是按着网上的一些教程一步一步来的,但是,还是会出现同样的问题,不过在Android/iPhone上却可以很好的工作,不知道是个什么问题,还希望了解的大神能帮忙解释)

下面是在搭建/配置L2TP/IPsec VPN的过程中整理出来的一键配置shell脚本,有Ubuntu下的,也有CentOS下的。都是我在Zeddicus大牛的脚本(现在已经打不开下载地址了)基础上,结合网上的其他教程进行修改后而成的(主要在于OpenSwan的版本以及将一些需要开机启动的操作写入/etc/rc.local),先看Ubuntu版本:

#!/bin/bash

if [ $(id -u) != "0" ]; then
    printf "Error: You must be root to run this tool!n"
    exit 1
fi
clear
printf "
####################################################
#                                                  #
# This is a Shell-Based tool of l2tp installation  #
# Version: 1.2                                     #
# Author: Zed Lau                                  #
# Website: http://zeddicus.com                     #
# For Ubuntu 32bit and 64bit                       #
#                                                  #
####################################################
"
vpsip=`ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk 'NR==1 { print $1}'`

iprange="10.0.192"
echo "Please input IP-Range:"
read -p "(Default Range: 10.0.192):" iprange
if [ "$iprange" = "" ]; then
	iprange="10.0.192"
fi

mypsk="ixyzero.com"
echo "Please input PSK:"
read -p "(Default PSK: ixyzero.com):" mypsk
if [ "$mypsk" = "" ]; then
	mypsk="ixyzero.com"
fi

clear
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 ""
echo "ServerIP:"
echo "$vpsip"
echo ""
echo "Server Local IP:"
echo "$iprange.1"
echo ""
echo "Client Remote IP Range:"
echo "$iprange.128-$iprange.254"
echo ""
echo "PSK:"
echo "$mypsk"
echo ""
echo "Press any key to start..."
char=`get_char`
clear

apt-get -y update
apt-get -y upgrade
apt-get -y install build-essential python2.7
apt-get -y install libgmp3-dev bison flex libpcap-dev ppp pptpd iptables make gcc lsof vim
mkdir /ztmp
mkdir /ztmp/l2tp
cd /ztmp/l2tp
wget --no-check-certificate https://download.openswan.org/openswan/openswan-2.6.38.tar.gz
tar zxvf openswan-2.6.38.tar.gz
cd openswan-2.6.38
make programs install
rm -rf /etc/ipsec.conf
touch /etc/ipsec.conf
cat >>/etc/ipsec.conf<<EOF
config setup
    nat_traversal=yes
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey

conn L2TP-PSK-NAT
    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=$vpsip
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any

EOF
cat >>/etc/ipsec.secrets<<EOF
$vpsip %any: PSK "$mypsk"
EOF
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
sed -i 's/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=1/g' /etc/sysctl.conf
sysctl -p
iptables --table nat --append POSTROUTING --jump MASQUERADE
for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done
/etc/init.d/ipsec restart
ipsec verify

aptitude install xl2tpd ppp

rm -rf /etc/xl2tpd/xl2tpd.conf
touch /etc/xl2tpd/xl2tpd.conf
cat >>/etc/xl2tpd/xl2tpd.conf<<EOF
[global]
ipsec saref = yes
[lns default]
ip range = $iprange.128-$iprange.254
local ip = $iprange.1
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
EOF
rm -rf /etc/ppp/options.xl2tpd
touch /etc/ppp/options.xl2tpd
cat >>/etc/ppp/options.xl2tpd<<EOF
require-mschap-v2
ms-dns 208.67.222.222
ms-dns 8.8.8.8
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
EOF
cat >>/etc/ppp/chap-secrets<<EOF
hey l2tpd heyman *
EOF
touch /usr/bin/l2tpstart
echo "#/bin/bash" >>/usr/bin/l2tpstart
echo "for each in /proc/sys/net/ipv4/conf/*" >>/usr/bin/l2tpstart
echo "do" >>/usr/bin/l2tpstart
echo "echo 0 > $each/accept_redirects" >>/usr/bin/l2tpstart
echo "echo 0 > $each/send_redirects" >>/usr/bin/l2tpstart
echo "done" >>/usr/bin/l2tpstart
chmod +x /usr/bin/l2tpstart
iptables --table nat --append POSTROUTING --jump MASQUERADE
l2tpstart
xl2tpd
cat >>/etc/rc.local<<EOF
iptables --table nat --append POSTROUTING --jump MASQUERADE
/etc/init.d/ipsec restart
/usr/bin/l2tpstart
/usr/local/sbin/xl2tpd
EOF
clear
ipsec verify
printf "
if there are no [FAILED] above, then you can
connect to your L2TP VPN Server with the default
user/pass below:

ServerIP:$vpsip
username:hey
password:heyman
PSK:$mypsk

More account infomation, please see: /etc/ppp/chap-sercets
"
总体过程就是:

一、安装 IPSec。因为 IPSec 会对 IP 数据包进行加密和验证。这意味着你的电脑 / 移动设备与服务器之间传输的数据无法被解密、也不能被伪造。这里推荐用 openswan 这个后台软件包来跑 IPSec。

二、编辑 /etc/ipsec.conf 。

三、编辑 /etc/ipsec.secrets 。

四、开启端口转发:
for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done

五、检查一下 IPSec 能否正常工作:
sudo ipsec verify
如果在结果中看到「Opportunistic Encryption Support」被禁用了,没关系,其他项 OK 即可。

六、重启 openswan:
sudo /etc/init.d/ipsec restart

七、安装 L2TP。常用的 L2TP 后台软件包是 xl2tpd,它和 openswan 是同一帮人写的。

八、编辑 /etc/xl2tpd/xl2tpd.conf 。
需要注意的是 ip range 一项里的 IP 地址不能和你正在用的 IP 地址重合,也不可与网络上的其他 IP 地址冲突。

九、安装 ppp。这是用来管理 VPN 用户的。

十、编辑 /etc/ppp/options.xl2tpd 这个文件,没有的话就建一个。

十一、添加 VPN 用户。编辑 /etc/ppp/chap-secrets。

十二、重启 xl2tpd:
sudo /etc/init.d/xl2tpd restart

十三、设置 iptables 的数据包转发:
iptables –table nat –append POSTROUTING –jump MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

十四、因为某种原因,openswan 在服务器重启后无法正常自动,所以需要编辑 /etc/rc.local 文件。
到这里,设置工作已经基本完成。你可以用 Android 或 iPhone/iPad 试着连一下。

如果连接成功,上网也没问题的话,恭喜你,大功告成。如果连不上,慢慢排查问题吧(比如可以使用命令:xl2tpd -D,进行调试)。


注意:openswan 的版本对于配置能否成功有很大的影响,所以请多尝试。如果做完以上十四步还是连不上的话,请考虑从源码编译 openswan :

sudo apt-get install -y libgmp3-dev gawk flex bison
wget http://www.openswan.org/download/openswan-2.6.24.tar.gz
tar xf openswan-2.6.24.tar.gz
cd openswan-2.6.24
make programs
sudo make install
编译需要一段时间。你的 Linux 内核版本需要高于 2.6.6。


附上一些不错的参考资料:

《 “在Ubuntu上配置L2TP/IPsec VPN” 》 有 5 条评论

  1. Shadowsocks原理详解
    https://mp.weixin.qq.com/s?__biz=MzIxMjAzMDA1MQ==&mid=2648945850&idx=1&sn=f175ecbcd54ffc23a2c160570aef81e1

    Shadowsocks 原理简介及安装指南
    http://www.barretlee.com/blog/2016/08/03/shadowsocks/

    ShadowSocks的翻墙原理
    https://tumutanzi.com/archives/13005

    写给非专业人士看的 Shadowsocks 简介
    http://vc2tea.com/whats-shadowsocks/

    Shadowsocks 源码分析——协议与结构
    https://loggerhead.me/posts/shadowsocks-yuan-ma-fen-xi-xie-yi-yu-jie-gou.html

    SS详解(一):原理
    http://rt.cn2k.net/?p=214

    【原创】翻墙代理 Shadowsocks 使用详解
    https://kefeng.wang/2016/12/15/shadowsocks/

    上网限制和翻墙基本原理
    http://blog.021xt.cc/archives/85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注