×××是一种新鲜也很没有乐趣的一项技术,感觉很庞大很有容纳性,自己觉得对于现在的大部分应用来说,PPTP 和L2TP 结合IPSec很流行,而它们有各自有不同的特点,但是如果想现在就用×××的话,这两种配置是必须会的。

在有2块网卡的(可以是虚拟网卡)linux上安装openswan,该linux就变成了一个ipsec vpn网关,网关后面是各种应用服务器。将其作为服务器端,可以进行两种配置(net to net或者是roadworrier)。

(1)在第一种方式下,客户端也要有一个有两块网卡的linux作为ipsec vpn 网关,两端的ipsec vpn网关地位是对等的。在两个网关间可以建立隧道,对数据进行加密认证等安全操作。这样两个网关后的计算机之间可以相互ping通,他们之间可以进行安全的通信了。但是网关与另一边网关后的计算机之间不能ping通,所有如果对方是移动用户的话这种方式是不行的,这就产生了第2种方式。

(2)在第二种方式下,如果对方是linux的移动用户(可以是laptop,也可以是智能手机),那么就需要在移动用户上安装openswan,设置成roadworrier连接方式。如果对方是window的移动用户,那就必须安装专门的

vpn拨号软件了。如果这样觉得麻烦,也可以在服务器端的ipsec vpn网关上安装l2tp,使之变成l2tp+ipsec vpn 网关,这样客户端就可以直接用window自带的拨号连接了。移动用户拨号成功就建立了和服务器端的vpn网关的隧道,这样移动用户就可以和网关后的计算机进行安全通信了。

建立vpn隧道可以通过pptp,l2tp(第2层),ipsec(第3层),ssl(第5层)不同的方式。ipsec的安全性高,但是配置麻烦,pptp/l2tp安全性低,但是配置简单。所以一般的应用只要对安全性要求不高就可以采用pptp/l2tp,如果应用对安全性要求高的话,就必须使用ipsec进行保护了。

pptp和l2tp都是适用于拨号连接的,都是使用ppp协议进行数据帧的封装,然后在普通的ppp帧上加一些包头,其中使用chap和pap进行安全性操作。他们之间的不同主要是pptp要求ip网络,l2tp要求点对点的网络。

采用哪种vpn要看具体的需求,本文讲述l2tp+ipsec vpn的配置,这样不但使用了ipsc 强安全性的特点,还能够方便的兼容window客户端。

本实验的网络结构如下:

 有3台计算机,在同一个局域网内

  一个是window客户端,ip是192.168.0.187,其网关ip为192.168.0.1

  一个是l2tp+ipsec vpn网关(系统是2.6.9内核的red hat enterprose linux),它是一台虚拟机,

  有一个本地网卡(eth0),还有一个虚拟网卡(eth1)。eth0的ip是192.168.0.115,网关ip是  

  192.168.0.115。eth1的ip是192.168.2.1,网关ip是192.168.2.1。

  一个是vpn网关维护的一个内网(网段是192.168.2.0/254)上的一台linux服务器(名为jim),上面

  安装了一个apache,架设了一个网站。其ip为192.168.2.10,网关ip为192.168.2.1

 现在我的目标是使用window客户端安全的读取jim上架设的网站。

  在window客户端没有拨号与vpn网关建立l2tp+ipsec vpn隧道前,window客户端与jim处在不同的网段

  下,彼此之间不能ping通;并且客户端与vpn网关之间也不能ping通;在建立隧道后,window客户端与

  vpn网关之间建立了一条隧道,这样客户端与vpn网关之间就可以ping通了,并且vpn网关分配给客户端一个内网ip,这样客户端与jim之间也可ping通,这样window客户端就可以访问内网上的jim服务器了,并且这种访问是在ipsec的保护下进行的,所以是安全的。

   

详细步骤如下:

1.在vpn网关上架设l2tp服务器:

(1) 安装xl2tpd (不建议安装l2tpd)

(2) 配置xl2tpd

   主配置文件在/etc/xl2tpd/xl2tpd.conf

    <1> 修改/etc/ppp/chap.secrets (l2tp里面会使用chap对用户的身份进行验证,就相当于拨号时输入的用户名密码的作用一样) 在该文件的最后一行输入 用户名 × 密码 (*表示用户可以使用任意的网段进行拨号,例如 test × “test123456”

    <2>修改/etc/ppp/options.l2tp

      文件如下:

       ipcp-accept-local
       ipcp-accept-remote
       #ms-dns  202.96.209.6
       #需要设置dns,就把上一行的#号去掉
       ms-wins 192.168.0.187(window客户端的ip)
       #noccp
       auth
       crtscts
       idle 1800
       mtu 1200
       mru 1200
      #mtu需要小于1500。也可以设成其它值,如1300
      nodefaultroute
      debug
      lock
      connect-delay 5000
      logfile /var/log/l2tpd.log
      proxyarp

   <3>修改主配置文件/etc/xl2tpd/xl2tpd.conf (;表示注释)

      文件如下:

    [global]
    listen-addr = 192.168.0.115  (#网关的eth0的ip,网关通过该网卡监听window客户端的连接

                                   请求)
    port=1701 
    auth file = /etc/ppp/chap-secrets

    [lns default]
    ;exclusive = no 
    ip range = 192.168.2.128-192.168.2.254 (#window客户端连接上后给客户端的内网ip,现在

                                             网关后的内网网段时192.168.2.0/254)
    ;ip range即l2tp拨号成功后分配给客户端的ip地址范围。
    local ip = 192.168.0.115
    ;lac = 0.0.0.0-255.255.255.255
    require chap = yes
    refuse pap = yes
    require authentication = yes
    name = ×××Gateway
    ppp debug = yes
    pppoptfile = /etc/ppp/options.l2tp
    length bit = yes

    至此,l2tp就配置完成了。

 2.在vpn网关上架设ipsec服务器 

   (1)安装openswan

       安装之前,需要修改配置。在/etc/sysctl.conf文件中,找到
       net.ipv4.ip_forward = 0
       net.ipv4.conf.default.rp_filter = 1 
       改为:
       net.ipv4.ip_forward = 1
       net.ipv4.conf.default.rp_filter = 0 
       然后执行sysctl -p使之生效。

      安装就是老套了,只是要注意内核的版本,在2.6的内核上安装不需要再打其它的补丁,只需要直接安

      装openswan的源代码就好了,在2.4的版本上安装由于内核没有对ipsec堆栈支持需要打openswan的

      klips补丁和nat补丁,较麻烦。所以建议在2.6.9的内核版本上安装openswan。

  (2) 配置openswan(就是配置认证方式,可以时rsa或者是x.509,这里采用x.509认证方式)

        其主配置文件为/etc/ipsec.conf,/etc/ipsec.secrets(ipsec 也进行认证,l2tp的认证可

                                                        以省略了)

        其配置目录在/etc/ipsec.d 里面是对x.509证书的配置。

        /etc/ipsec.d/cacerts       存放X.509认证的根证书
        /etc/ipsec.d/certs         存放X.509客户端证书
        /etc/ipsec.d/private       存放X.509认证私钥
        /etc/ipsec.d/crls        存放X.509证书撤消列表(只配置x.509证书认证,下面不需要)

        /etc/ipsec.d/ocspcerts             存放X.500 OCSP证书
        /etc/ipsec.d/passwd                XAUTH密码文件

        /etc/ipsec.d/policies              存放Opportunistic Encryption策略组

    采用openssl产生ca证书,vpn网关上的证书,客户端的证书。

     建立如下目录/root/ca/demoCA,demoCA存放ca存放ca证书和撤销列表。而网关证书与认证私钥,客

     户端证书与私钥放在ca下。

    现使用以下命令在/root/ca/demoCA下产生ca根证书cacert.pem和其私钥cakey.pem 和crl表

     crl.pem,

   openssl req –x509 –days 3650 –newkey rsa:1024 –keyout cakey.pem –out cacert.pem

   进入demonca目录:

    mkdir newcerts
   touch index.txt
   echo “01” > serial

   openssl ca -gencrl -out crl.pem

    然后在/root/ca/下使用以下命令产生网关的认证私钥vpngateway.key和证书vpngateway.cert

    Openssl req –newkey rsa:1024 –keyout vpngateway.key –out vpngatewayreq.pem

    Openssl ca –in vpngatereq.pem –days 365 –out vpngateway.cert –notext

       然后将ca证书与网关证书与私钥放进网关上的openswan的相依目录下:

     cp cacert.pem        /etc/ipsec.d/cacerts
     cp vpngateway.cert   /etc/ipsec.d/certs
     cp vpngateway.key    /etc/ipsec.d/private

    在做完了这些准备后,

   以同样方法为window客户端生成证书与私钥。

   开始写ipsec.conf了。

    <1> 编辑vpn网关上的/etc/ipsec.secerts,在此文件最后加上一行

    : RSA /etc/ipsec.d/private/vpngateway.key "读取此key的密码"

    <2> 编辑vpn网关上的/etc/ipsec.conf

       version 2.0 

 

config setup
  interfaces=%defaultroute
 nat_traversal=yes
 virtual_private=%v4:192.168.0.0/16,%v4:10.0.0.0/8,%v4:172.16.0.0/12,%v4:!192.168.0.0/24

conn %default
 compress=yes
 authby=rsasig
 disablearrivalcheck=no
 leftrsasigkey=%cert
 rightrsasigkey=%cert
 keyingtries=1
     
conn l2tpx509
 pfs=no
 auto=add
 left=192.168.0.115
leftcert=vpngateway.cert
 leftprotoport=17/1701
 right=%any
 rightca=%same
 rightprotoport=17/%any
 
include /etc/ipsec.d/examples/no_oe.conf

<3> 输入命令service ipsec restart重启ipsec服务。
    输入命令 xl2tpd -D 以前台模式启动L2TPD服务。

vpn网关配置完毕。

接着配置window客户端来测试与vpn网关之间的隧道建立情况:

 

导出CA和Win端的证书:

在网关的/root/ca下,用以下命令将CA证书cacertpem的格式转化为p12文件:
openssl pkcs12 -export -in democA/cacert.pem -inkey demoCA/private/cakey.pem  -out demoCA.p12
输入读取CA密钥的密码,然后再指定导出p12文件中的证书(为下一步将ca证书导入到window上的mmc需要该密码)需要的密码,再确认此密码即可。
然后导出win端的证书:
openssl pkcs12 -export -in purewinter.cert -inkey purewinter.key -out purewinter.p12
把这两个文件通过安全方式复制到Windows客户端。

导入证书:

运行mmc,添加删除管理单元->添加->证书->计算机账户->本地计算机->完成。
在证书:本地计算机里,选择个人->所有任务->导入,导入两个p12证书。把CA的证书由个人拖到“受信任的根证书颁发机构”里。

添加拨号连接:

网络连接->创建一个新连接->连接到我工作场所的网络->虚拟专用网络连接->随意输入一个名字->不拨初始连接->192.168.0.115->完成。
右键点此连接,选属性-网络-×××类型选择为L2TP IPSec ×××,选定TCP/IP协议,属性-高级,去掉“在远程网络上使用默认网关”的勾。确定。双击此连接,输入用户名test,密码test123456进行拨号。如果顺利,就拨号成功了。(有些系统拨号时会发生789错误,这是因为这些系统在启动时默认启动了一个ipsec服务,所以你再要启动一个ipsec时拒绝,这就需要修改注册表)。在×××Gateway的tcpdump可以看到加密信息在传输,L2TPD的输出中可以看到Call established with 192.168.0.187...等字样。此时在客户端ping网关发现可以ping通了,还发现客户端获得了一个vpn内网ip 192.168.2.128,在Jim上输入service httpd start启动Apache服务,然后在Win客户端的浏览器中输入http://192.168.2.10/,就可以看到Jim上架设的网站了。如果没有架设,可能看到Apache的默认页面,或者看到403禁止访问,Apache 2.x.x的信息。至此L2TP的IPSec ×××架设成功。

如果外网的window客户端想要连接网关,那么网关就需要安装配置在具有外网ip的计算机上。