首页 > Linux > VPS上基于Debian搭建和配置L2TP/IPsec VPN

VPS上基于Debian搭建和配置L2TP/IPsec VPN

2012年12月8日 LTNS     访问次数 1,312 发表评论 阅读评论

曾经在OpenVZ上搭建过 基于Debian的OpenVPN,最近由于众所周知的原因开始转向L2TP/IPsec的VPN,一开始在原先的OpenVZ上尝试,折腾了半天才发现没戏,这里有篇 文章 提到 “说实在的搭建L2TP over IPSec VPN让人头痛不少,主要是因为需要好几个内核模块支持。因而如果你使用的是OpenVZ的VM的话基本上可以忽略这篇文章-2.6.32以下的内核不支持IPSec虚拟化”。

于是改用Xen,还是Debian 6.0 Squeeze的操作系统,也是折腾了数个晚上才搞定,在此做个记录。

需要用到的ssh软件:putty和winscp。 ssh登录vps后,先运行如下的一行命令来检查一下内核模块是否齐全

modprobe af_key && modprobe ah4 && modprobe esp4 && modprobe ipcomp && modprobe xfrm4_tunnel && echo "All IPSec modules are loaded"

如果输出 All IPSec modules are loaded 则说明正常,否则不能搭建L2TP over IPSec。

接下来更新一下源,然后安装openswan和xl2tp这两个软件

aptitude update
aptitude install xl2tpd openswan

然后用winscp登录vps后编辑(当然在putty中用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

其中的YOUR.SERVER.IP.ADDRESS需改成VPS的ip地址,另外需要注意的是文件的结尾部分必须有新行,即,编辑到末尾再敲1-2个回车,否则启动ipsec时会提示如下且没有出错代码
“Segmentation fault
openswan failed to exec the requested action – the following error occured:”

这个问题在我之前折腾ipsec@openvz时就花了我好几个小时,最后发现初始的ipsec.conf文件末尾多了两个换行才依样画葫芦搞定的 ,另外,根据之前的经验,一些行开头的缩进也必须保留,而且缩进必须是TAB而不能是空格否则启动ipsec时会提示该行格式不对(不过xen下的debian 6空格却没问题,似乎是debian 6不同源造成的差异)。

然后编辑 /etc/ipsec.secrets ,添加一行

YOUR.SERVER.IP.ADDRESS   %any:  PSK "YourSharedSecret"

把如上的YOUR.SERVER.IP.ADDRESS替换成VPS的公网ip地址,YourSharedSecret替换成你自己喜欢的密钥字符串。

同样必须注意的是:文件末尾必须有至少一个换行(也是参照之前的经验),否则vpn客户端连接会提示800错误(尽管在下一步骤中的ipsec verify检查都正常 :(),并在/var/log/auth.log里会有出错提示
“… vpn pluto[6294]: “test2″ #1: probable authentication failure (mismatch of preshared secrets?): malformed payload in packet”

运行如下五行命令

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

然后检查一下IPSEC是否工作正常

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.28/K2.6.32-5-686-bigmem (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 that pluto is running                                  [OK]
Pluto listening for IKE on udp 500                              [OK]
Pluto listening for NAT-T on udp 4500                           [OK]
Checking for 'ip' command                                       [OK]
Checking for 'iptables' command                                 [OK]
Opportunistic Encryption Support                                [DISABLED]

最后一行显示DISABLED没关系,其他地方有出错的话重启一下IPSEC再试

/etc/init.d/ipsec restart
ipsec verify

接下来编辑 /etc/xl2tpd/xl2tpd.conf ,改成如下(注意ip range一项里的ip段不能和客户端正在用的ip地址有冲突)

[global]
ipsec saref = yes

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

编辑 /etc/ppp/options.xl2tpd,如没有就新建一个,内容如下

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

现在编辑 /etc/ppp/chap-secrets,添加VPN帐号,比如

# user      server      password            ip
test        l2tpd       testpassword        *

其中test和testpassword是用户名和密码,可自行设置,l2tpd是强制该帐号只能用l2tp协议登录,更多的帐号可以按照同样的格式添加到下一行。

重启xl2tp

/etc/init.d/xl2tpd restart

检查一下xl2tpd是否正常运行

ps -aux | grep l2tp

如果没有xl2tp的进程说明没有启动,则以调试方式运行来检查一下

xl2tpd -D

正常情形下应该是显示如下的内容

xl2tpd[9501]: Enabling IPsec SAref processing for L2TP transport mode SAs
xl2tpd[9501]: IPsec SAref does not work with L2TP kernel mode yet, enabling forceuserspace=yes
xl2tpd[9501]: setsockopt recvref[22]: Protocol not available
xl2tpd[9501]: This binary does not support kernel L2TP.
xl2tpd[9501]: xl2tpd version xl2tpd-1.2.4 started on vps.server.com PID:9501
xl2tpd[9501]: Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.
xl2tpd[9501]: Forked by Scott Balmos and David Stipp, (C) 2001
xl2tpd[9501]: Inherited by Jeff McAdams, (C) 2002
xl2tpd[9501]: Forked again by Xelerance (www.xelerance.com) (C) 2006
xl2tpd[9501]: Listening on IP address 0.0.0.0, port 1701

设置iptables 的数据包转发

iptables --table nat --append POSTROUTING --jump MASQUERADE
    echo 1 > /proc/sys/net/ipv4/ip_forward

因为某种原因,openswan 在VPS重启后无法正常自动加载,所以需要在 /etc/rc.local 文件里写入如下语句

iptables --table nat --append POSTROUTING --jump MASQUERADE
    echo 1 > /proc/sys/net/ipv4/ip_forward
    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

到这里服务器端的设置就完成了,现在可以用iphone/ipad,android,或者win7自带的vpn客户端连接了,如果有问题,可以检查一下 /var/log/auth.log 文件,看看其中是否有出错提示。

 

补充:
发现openswan和ios设备的兼容性有点问题,现象就是:iphone或ipad连通着vpn时进入sleep状态的话,唤醒后很可能就再也连不上vpn服务器了。网上有篇 文章 说是ios的设备退出时不能正常终止连接所致,按照其中的做法,在ipsec.conf文件里添加三行但仍不管用。

dpddelay=30
dpdtimeout=120
dpdaction=clear

不得已,暂时放弃,改用Cisco IPsec VPN(通过racoon实现ipsec),黑莓或ios设备自带的VPN客户端支持,但Windows和Android自带的VPN客户端不支持,Windows可以用Cisco官方的VPN客户端,但Android目前似乎还没有一个可靠的客户端。

 
 

参考文章
http://www.cnblogs.com/hbycool/articles/1728295.html
http://blog.riobard.com/2010/04/30/l2tp-over-ipsec-ubuntu
http://b.gkp.cc/2010/06/19/setup-ipsec-l2tp-on-centos-55/
http://www.lostbyte.com/projects/l2tpipsec-vpn-for-ios/

 

分类: Linux 标签: , , , , , , ,
  1. mocha
    2014年11月9日17:16 | #1

    楼主求助
    我在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.37/K(no kernel code presently loaded)
    Checking for IPsec support in kernel [FAILED]
    SAref kernel support [N/A]
    Checking that pluto is running [FAILED]
    whack: Pluto is not running (no “/var/run/pluto/pluto.ctl”)
    Two or more interfaces found, checking IP forwarding [FAILED]
    whack: Pluto is not running (no “/var/run/pluto/pluto.ctl”)
    Checking NAT and MASQUERADEing [OK]
    Checking for ‘ip’ command [OK]
    Checking /bin/sh is not /bin/dash [WARNING]
    Checking for ‘iptables’ command [OK]
    Opportunistic Encryption Support [DISABLED]

  2. mocha
    2014年11月9日18:15 | #2

    /etc/init.d/ipsec start
    ipsec_setup: Starting Openswan IPsec 2.6.37...
    ipsec_setup: No KLIPS support found while requested, desperately falling back to netkey
    ipsec_setup: Even NETKEY support is not there, aborting
    博主如何加载Netkey模块?

    • LTNS
      2014年11月15日22:15 | #3

      @mocha
      你的vps是openvz的吧,应该用不了 L2TP/IPsec VPN,建议改用strongSwan

  1. 2013年8月26日22:05 | #1
19 - 7 = (必填)