在 Linux 上搭建 L2TP/IPSec VPN

回复 收藏
转自:http://jiehan.org/tech/setting-up-l2tp-ipsec-vpn-on-linux/

看回复帖
〇、说在最前
虽然我不喜欢扯淡,但是有些淡还是必须要扯的:

本次搭建,必须要的是:

一台 VPS 或是独立服务器(至于服务器放在哪里,这个很有讲究,比如你不可以选择朝鲜 VPS 或是和朝鲜 VPS 类似的 VPS)
Ubuntu Server(或其它操作系统,但我未做测试)
若是 VPS,请尽量使用 Xen 虚拟化技术(OpenVZ 的网络我还没有测试过)
以 root 用户或同等权限用户登录
至少 3 个小时的空余时间、足够的耐心(初次安装花了我几天的时间,问了很多朋友,这次再安装,也用了我一个下午的时间。不过希望本教程可以助您缩短这个时间)
本次搭建,达到的目的有:

一个 L2TP/IPSec VPN
使用预共享密钥(PSK)、用户名密码进行加密和验证
Mac OS X、iOS 能够正常连接
本次搭建无论如何也达不到的是:

无法在 Windows 系统中连接
扯淡完毕。开始正事 ——

一、简单的原理介绍
通过上次和 Paveo 大叔聊天,还有平时一些肤浅的了解,我们知道,所谓 L2TP/IPSec 就是 L2TP over IPSec。也就是说,这种 VPN 方式分两个部分,IPSec 和 L2TP。我们要先做好 IPSec 的部分。

在这个应用场景下,我的理解,IPSec 使用预共享密钥(PSK)进行加密和验证,L2TP 负责封包,PPP 负责具体的用户验证。

二、IPSec 部分
在这里,我们使用 Openswan 来实现 IPSec。

Ubuntu 当前的 lucid 源中,Openswan 有关于 NAT 的 bug,会妨碍某些情况下的用户连接,因此,我们先来手动编译它。

若您在 2010 年 11 月或以后看到本篇文章,并且使用最新的发行版,则您无须手动编译,只需运行 aptitude install openswan 即可。因为在您的发行版软件仓库中的 openswan 包已经修复了那个 bug。

1. 安装编译工具
初次编译程序,您需要安装一些编译所必须的包。一次运行:

aptitude install build-essential请注意,如果您编译过其它软件,您很可能已经装过这个包了,不必重复安装。

一些 Openswan 所依赖的包:

aptitude install libgmp3-dev gawk flex bison2. 下载、解压缩、编译并安装 Openswan 2.6.27
我们还是到 root 目录来操作吧,不要弄脏别的目录。运行:

cd ~/从官方网站下载 Openswan 2.6.27:

wget http://www.openswan.org/download/openswan-2.6.27.tar.gz请注意,若您发现了更新版本的 Openswan,我建议您安装更新版本的,请将 2.6.27 替换为您找到的版本号。若您不太关心这些,请无须更改而直接运行。

解压缩:

tar xzvf openswan-2.6.27.tar.gz小提示,在 Linux 中,由于目录是区分大小写的,所以系统支持 Tab 键自动补全。比如您输入上面的命令时,输入完“tar xzvf o”以后,若当前目录下没有其他“o”开头的文件,按一下键盘的 Tab 键,“penswan-2.6.27.tar.gz”就会自动出现。

cd 进入 openswan-2.6.27/ 目录:

cd openswan-2.6.27/编译:

make programs这将花费一段时间。

安装:

make install若您没有看到错误信息,那么编译大功告成!请进入下一步,

3. 编辑 IPSec 配置文件
请使用您喜欢的编辑器打开 /etc/ipsec.conf 文件。若没有或从未做过,请运行 aptitude install vim 来安装 Vi IMproved。

vi /etc/ipsec.conf找到 protostack 一行,(按 Insert 键,移动光标到相应位置)将其值改为 netkey。应该是这个样子的:

protostack=netkey好的,现在请将光标移动到文件末尾(末尾应该是一些注释说明,在它的下面),复制如下一段内容,

(下面的配置文件已于 2010 年 6 月 28 日中午更新:刚刚 KhaosT 同学指导,使用原配置,未经 NAT 设备的设备是无法连接的。他提出如下更正,经多次、多环境测试无误,请使用下面的配置。本次主要影响到中国电信 EV-DO 用户、小部分 ADSL 用户)

conn %default
        forceencaps=yes

conn L2TP-PSK-NAT
        rightsubnet=vhost:%no,%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=您服务器的公网IPv4地址
        leftprotoport=17/1701
        right=%any
        rightprotoport=17/%any
这时您应该在 insert 模式,按 Esc 以退出,然后输入 :wq 以保存。

嗯,IPSec 部分就快完成了。下面我们来设置 PSK 预共享密钥,用编辑器打开(没有就创建) /etc/ipsec.secrets 文件。

vi /etc/ipsec.secrets按 Insert,输入下面一行内容

您服务器的公网IPv4地址 %any: PSK "您的预共享密钥"下面我们需要对系统的网络策略进行一些调整,请运行(一行一行地输入,输入完按回车,请忽略行首的空格):

for each in /proc/sys/net/ipv4/conf/*
do
    echo 0 > $each/accept_redirects
    echo 0 > $each/send_redirects
done
同时,将上面这段代码完整地复制一次,加入到 /etc/rc.local 中,使其在每次系统启动时都生效。具体方法是,运行 vi /etc/rc.local,将光标移动到 exit 0 之前的行,按 Insert,再使用终端的复制功能(右键 > 粘贴)。再按 Esc 退出 insert 模式,输入 :wq 保存。

接下来,我们来重启一次 IPSec 服务,

service ipsec restart然后尝试使用 L2TP/IPSec 客户端连接一次,请输入正确的 PSK(也有可能叫做“secret”或“预共享密钥”)。这次连接肯定不成功,如果成功,您可以去买彩票了,因为我们还没有做 L2TP 部分呢。这次连接的目的只是测试我们的 IPSec 部分配置是否成功。请运行

cat /var/log/auth.log | grep pluto以查看最后一行是否包含类似

IPsec SA established transport mode的行。若有,则说明一切无误,请继续。(否则请运行 ipsec verify 查看发生了何种问题)

三、L2TP 部分
其实搭建也不是那么复杂,对吧。我们先来进行 L2TP 部分的配置,在这里,我们使用 xl2tpd 来实现。

1. 从源安装 xl2tpd  (源码下载地址 wget http://www.xelerance.com/wp-content/uploads/software/xl2tpd/xl2tpd-1.2.7.tar.gz)
运行:

aptitude install xl2tpd2. 编辑 L2TP 配置文件
请打开 /etc/xl2tpd/xl2tpd.conf 文件,编辑方法您应该在上面已经学习过了,这里不再赘述。

vi /etc/xl2tpd/xl2tpd.conf先别动光标,按 dG(D + Shift + G)删除文件所有内容,替换成:

[global]
; listen-addr = 192.168.1.98

[lns default]
ip range = 10.1.1.2-10.1.1.255
local ip = 10.1.1.1
require chap = yes
refuse pap = yes
require authentication = yes
name = LinuxVPNserver
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes做一下简单的解释,这里的 ip range 项是连接上来的用户所获得到的服务器端内网的 IPv4 地址段。而 local ip 是在新建的网络接口 pppX 所占用的那个 IP 地址。因此,它们都不能和服务器端内网的任何 IP 地址(段)相重复或冲突。若不能理解,没关系,就请不要修改这个值。

修改完请保存。

注意到了吗,pppoptfile 这一项的值,指向到了一个现在也许不存在的目录下面的 options.xl2tpd 文件。对,我们现在就来配置 PPP。

四、PPP 的配置
首先应该安装 ppp 包:

aptitude install ppp从 xl2tpd 文档中复制一个配置文件样例到我们的配置文件目录:

cp /usr/share/doc/xl2tpd/examples/ppp-options.xl2tpd \
/etc/ppp/options.xl2tpd出于网页宽度的限制,这是个多行命令,您可一次复制进终端,或是选择逐行输入。

下面打开编辑这个 /etc/ppp/options.xl2tpd,

vi /etc/ppp/options.xl2tpd先不要按 Insert,将光标移动到第一个 ms-wins 的所在行,按 dd(D + D),再按 dd,删除它们。这时再按 Insert,将 ms-dns 项调整为 Google Public DNS:

ms-dns 8.8.8.8
ms-dns 8.8.4.4其它的都不要动,保存。

就快完成啦!我们来添加用户账户,“账户”都在 /etc/ppp/chap-secrets 中:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
用户名           *       "密码"                   *
userA           *       "password"              *建议使用 Tab 进行定位,以保持数据的整齐,抱歉,我在网页中不易实现。

重启一下 xl2tpd 吧:

service xl2tpd restart至此,IPSec、L2TP、PPP 应该都配置完毕了。您可以测试连接,xl2tpd 的日志文件应该包含在 /var/log/daemon.log 中。

这时虽然可以连接上 VPN,但是只能访问内网。需要说明的是,VPN 的功能就是这些。至于我们所说的“上网”,那就是下面数据转发的事情了,和 VPN 已经无关了。

五、转发设置
首先在系统的 /etc/sysctl.conf 将 net.ipv4.ip_forward 启用,具体方法是:

vi /etc/sysctl.conf然后不要按 Insert,用键盘上下键滚动,找到 net.ipv4.ip_forward 一行,将光标移动至其前面的 # 号上,按键盘的 X 键,此时 # 号消失(此行被 uncomment),应该看起来是这样的:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1请保存。再运行

sysctl -p以直接令其生效。

我们使用发行版中通常包含了的 iptables 来配置更具体的转发。为避免繁琐的 iptables “永久”规则设定,我们让服务器每次启动时都设置一次,还需要用到 /etc/rc.local,请运行:

vi /etc/rc.local将下面内容复制进来,复制之前这里应该已经有 5 行我们之前添加的代码,现在可以将下面这行添加在它的上面或下面,唯不要将其加在 5 行中间 ……

iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -o eth0 -j MASQUERADE这将应用我们刚刚设置的子网 10.1.1.0/24 的数据包可以从 eth0 接口被转发。

这时,您可以运行 reboot 重启您的服务器,或在终端运行一次上述 iptables 命令,即可令转发立即生效。

六、清理工作
我们之前使用 wget 下载,使用 tar 解压缩出来的东西依然在 ~/,但它们已经没有用了,我们可以将它删除:

rm -fIrv ~/openswan*七、看起来无关紧要但很重要的两句话
恭喜您成功配置 L2TP/IPSec VPN。
请尽量多建立些帐号分享给您的朋友。
八、致谢
2011-02-17 13:07 举报
已邀请:
0

阿铭 管理员

赞同来自:

备注: 第一次参考这篇文章时,并没有配置出来。最后在网上找了多篇文档,并试验多次,最终搞定。以下这篇是值得参考的  http://b.gkp.cc/2010/06/19/set ... s-55/   内容如下:

下载源代码并编译安装

cd /usr/src
wget https://download.openswan.org/ ... ar.gz  (如果该地址失效,请到download.openswan.org/openswan下载)
tar zxvf openswan-2.6.32.tar.gz
cd openswan-2.6.32
make programs install修改配置文件

vi /etc/ipsec.conf内容

version 2.0
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=YOUR.SERVER.IP.ADDRESS
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any设置 Shared Key

vi /etc/ipsec.secrets内容

YOUR.SERVER.IP.ADDRESS %any: PSK "YourSharedSecret"
修改包转发设置

for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done

vi /etc/sysctl.conf
修改 net.ipv4.ip_forward = 1
sysctl -p
重新启动 ipsec,并测试运行效果

/etc/init.d/ipsec restart
ipsec verify如下即为正常工作

Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path                                 [OK]
Linux Openswan U2.6.24/K2.6.32.12-linode25 (netkey)
Checking for IPsec support in kernel                            [OK]
NETKEY detected, testing for disabled ICMP send_redirects       [OK]
NETKEY detected, testing for disabled ICMP accept_redirects     [OK]
Checking for RSA private key (/etc/ipsec.secrets)               [OK]
Checking that pluto is running                                  [OK]
Pluto listening for IKE on udp 500                              [OK]
Pluto listening for NAT-T on udp 4500                           [OK]
Two or more interfaces found, checking IP forwarding            [OK]
Checking NAT and MASQUERADEing                                  [OK]
Checking for 'ip' command                                       [OK]
Checking for 'iptables' command                                 [OK]
Opportunistic Encryption Support                                [DISABLED]
这个时候 ipsec 部分完成了,可以测试一下,新建一个 ipsec+l2tp 的连接,填好服务器地址和 SharedKey,点连接,注意看服务器那边的 /var/log/secure (CentOS) /var/log/auth.log(Debian),如果出现了类似

STATE_QUICK_R2: IPsec SA established transport mode这样的日志就说明 ipsec 没问题了。如果你用 OS X,也可以看 /var/log/system.log |grep ppp,有类似

pppd[3624]: IPSec connection established也是成功了

第二大部分,安装l2tp,这里我使用了xl2tpd。这东西有点变态,没有l2tp-control,需要从rp-l2tp这个里面提取。

安装需要的库和软件包

CentOS:yum install libpcap-devel ppp

Debian:aptitude install libpcap-dev pppDebian 的话,可能需要建立一个 ppp device node,命令为

mknod /dev/ppp c 108 0
下载编译安装

cd /usr/src
wget http://downloads.sourceforge.n ... ar.gz
tar zxvf rp-l2tp-0.4.tar.gz
cd rp-l2tp-0.4
./configure
make
cp handlers/l2tp-control /usr/local/sbin/
mkdir /var/run/xl2tpd/
ln -s /usr/local/sbin/l2tp-control /var/run/xl2tpd/l2tp-control

cd /usr/src
wget  http://www.xelerance.com/wp-co ... ar.gz
tar zxvf xl2tpd-1.3.0.tar.gz
cd xl2tpd-1.3.0
make install
写配置文件

mkdir /etc/xl2tpd
vi /etc/xl2tpd/xl2tpd.conf     

内容如下,注意 ip range 不要和你的 lan ip 冲突。。。

[global]
ipsec saref = yes

[lns default]
ip range = 10.1.2.2-10.1.2.254
local ip = 10.1.2.1
refuse chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

ppp 配置文件

vi /etc/ppp/options.xl2tpd
内容如下:

require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4

设置拨号用户名以及密码

vi /etc/ppp/chap-secrets

内容格式

# user      server      password            ip
username        l2tpd       userpass        *

启用包转发

iptables -t nat -A POSTROUTING -s  192.168.11.0/24 -o eth0 -j SNAT --to-source 123.12.12.12

这里要提一下,192.168.11.0/24为/etc/xl2tpd/xl2tpd.conf中定义的私网网段,最后面的IP则为/etc/ipsec.conf中定义的left ip。
之后就可以启动 l2tp 了,先用 debug 方式启动,有错误可以直接在 console 看到

xl2tpd -D把刚才建立的连接写上用户名和密码,华丽的点击 connect 吧!如果没问题的话,把包转发和xl2tpd启动指令设置为开机运行

vi /etc/rc.local加入

iptables -t nat -A POSTROUTING -s  192.168.11.0/24 -o eth0 -j SNAT --to-source 123.12.12.12
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
/usr/local/sbin/xl2tpd
大功告成!
0

阿铭 管理员

赞同来自:

搭建完后,如何在windows上测试呢,我用的是windows XP 系统,步骤如下:

(1) 打开网络连接页面,在左侧选择“创建一个新的连接”,点“下一步”,选择“连接到我工作场所的网络”,继续“下一步”,选择“虚拟专用网络连接”,继续“下一步”,公司名字自定义,比如 comsenz ,继续“下一步”,选择“不拨初始连接”。继续“下一步”,这里的IP要写远程VPN服务器的IP。继续点“下一步”完成创建这个连接。

(2)完成后,会出现一个连接的对话框,要输入用户名和密码,先不要输入,点下“属性”。点“安全”,先把“要求数据加密”前的对钩去掉,再点右下角的“IPSec 设置”,在“使用预共享密钥作为身份认证”前打对钩,填写我们先前自定义的PSK密钥。点“确定”。

(3)再点上边“网络”,在vpn类型那里选择“L2pt Ipsec VPN”  再点“确定”。

(4)最后输入先前在 chap-secrets 文件中定义的用户名以及密码连接。

如果无法连接,出现798 等错误时,你要看下本地的IPSec 服务是否打开,具体方法为,win+r (快捷键)输入services.msc , 找到 IPSec Service 看是否启动。如果没有启动,则让其启动。

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: