×××是一种新鲜也很没有乐趣的一项技术,感觉很庞大很有容纳性,自己觉得对于现在的大部分应用来说,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的计算机上。