PPTP和IPSEC/L2TP的VPN笔记

来源:互联网 发布:网络攻击的种类包括 编辑:程序博客网 时间:2024/05/08 20:43

注意:只是个人理解,可能有不正确的地方。

在Linux系统下PPTP形式的VPN通常使用pptpd软件实现,IPSEC/L2TP形式的VPN通常使用openswan或者strongswan软件配合xl2tpd实现。

VPN的连接的认证和加密通常是基于PPP协议的。

PPP(Point-to-Point Protocol)协议

ppp协议是数据链路层的协议,与以太网(Ethernet)协议处于同一层。IP层的数据可以通过ppp链路传输。

一般如果电脑直接通过串口或并口或者其它方式连接在一起时,可以使用ppp协议形成一个数据链路层,供上层数据协议比如IP协议使用。

在现在这种直接连接的方式很少见了。但如果两台连接到互联网的计算机,将ppp数据包包裹到IP或其它协议中通过互联网发送时,就可以在两台计算机直接形成一条虚拟的连接,在这条连接上又可以发送其它协议的数据,如果发送的是IP协议,那就形成了一个虚拟的网络。

如果这个ppp连接两边是局域网,通过这条连接就将两个物理分隔的局域网连接在了一起,这应该就是虚拟局域网(VPN,Virtual Private Network)名称的由来。

由于PPP连接是不能自动完成的,需要在其它方式的控制下完成,这就是PPTP和L2TP协议的作用了。


PPTP方式的VPN基础


PPTP(Point-to-Point Tunneling Protocol)协议

PPTP是一个隧道协议。

首先PPTP客户端使用TCP协议向服务器发起连接请求,PPTP服务器默认使用TCP端口1723。

连接建立后使用GRE协议发送数据,但PPTP使用的GRE协议对标准的GRE协议有改动。

GRE(Generic Routing Encapsulation)协议工作在IP层上,使用的协议号为47。与TCP(协议号6)、UDP(协议号17)、ICMP(协议号1)等工作在同一层。debian7系统下协议号和对应协议名在/etc/protocols文件中有。

然后GRE协议又用来承载PPP协议数据。

PPP协议具有认证和加密的功能,所以PPTP方式的VPN认证和加密是依靠PPP协议来完成的。

为了保证传输中数据的保密性,需要加密,一般使用MPPE协议加密,而这个加密要求认证方式为MS-CHAP,所以pptp方式一般使用MS-CHAPv2认证和MPPE128加密。

但MPPE加密协议已经被发现有漏洞,可以被破解(见文后连接)。所以在需要数据绝对安全的情况下,不推荐使用PPTP方式的VPN。但目前破解对一般普通人还是不易完成,所以如果只是用来突破防火墙的包过滤,那还是可以使用的。


IPSEC/L2TP方式的VPN基础


IPSEC(Internet Protocol Security)协议

ipsec 是工作在ip层的安全协议。

ipsec首先通过ISAKMP(internet security association and key  management protocol)协议完成安全通路的建立。

ISAKMP使用UDP协议进行,UDP端口号为500。

安全通道建立后,加密后的数据通过ESP(Encapsulating Security Payload)协议发送。ESP协议工作在IP之上,使用的协议号为50。ESP和TCP(协议号6)、UDP(协议号17)、ICMP(协议号1)等工作在同一层。debian7系统下协议号和对应协议名在/etc/protocols文件中有。

安全通道建立后,如果只要保证数据来源和完整性,没有加密的要求,也可以使用AH(Authentication Header)协议发送。AH协议也工作在IP之上,使用的协议号为51。


L2TP(Layer 2 Tunneling Protocol)协议

L2TP是个隧道协议,使用UDP发送数据,默认使用端口1701。

xl2tpd软件是L2TP的实现,xl2tpd在使用L2TP建立隧道后,通过隧道中的数据再使用PPP协议传输。虽然理论上L2TP隧道可以传输其它协议的数据,但目前xl2tpd只支持PPP协议。

L2TP虽然有自己的认证方式,但方式有限,只有CHAP形式,不方便使用。

PPP协议认证方式支持较多,比如PAP、CHAP、MS-CHAP、EAP等。

所以xl2tpd中,推荐使用PPP协议完成认证。


使用IPSEC/L2TP实现加密的VPN

虽然只使用L2TP协议就可以实现VPN,但由于L2TP协议中的数据没有加密,所以这样的VPN不安全。

而将L2TP数据放到IPSEC中再发送就可以是数据加密,两者结合就可以实现加密的安全VPN。


2层隧道协议(L2TP)和点对点隧道协议(PPTP)是两种不同的隧道协议。对于设置VPN隧道来说,你经常发现三种不同的选择:PPTP、IPsec和IPsec over L2TP。总的来说,IPsec是最安全的选择,因为当正确实施时它能够为你的网络通讯提供保密性、完整性和身份识别服务。微软的Windows本地不支持直接的IPsec协议,因此,设置VPN支持Windows客户软件的管理员经常提供IPsec over L2TP连接。


参考:

https://github.com/hwdsl2/Docker-ipsec-vpn-server
http://blog.csdn.NET/xindoo/article/details/52830609


服务器端

首先先下载一个ipsec vpn的镜像

docker pull fcojean/l2tp-ipsec-vpn-server

然后本地设置一个.env的文件,比如这里创建的就是vpn.env,文件内容为

VPN_IPSEC_PSK=psk_password
VPN_USER_CREDENTIAL_LIST=[{"login":"Test1","password":"test1"},{"login":"Test2","password":"test2"}]

其中psk_password是预共享秘钥,然后下面是两个账户,Test1与Test2

然后可以启动L2TP镜像

首先挂载个内核模块

sudo modprobe af_key

然后运行镜像

docker run \
    --name l2tp-ipsec-vpn-server \
    --env-file ./vpn.env \
    -p 500:500/udp \
    -p 4500:4500/udp \
    -v /lib/modules:/lib/modules:ro \
    -d --privileged \
    fcojean/l2tp-ipsec-vpn-server

然后查看运行是否成功,docker logs l2tp-ipsec-vpn-server,看到显示Connect to your new VPN with these details:即可。

笔者测试是第一次运行的时候需要加--name l2tp-ipsec-vpn-server \,后面运行如下即可,由于笔者环境不需要开机自启动,所以就没加自启了

docker run \
    --env-file ./vpn.env \
    -p 500:500/udp \
    -p 4500:4500/udp \
    -v /lib/modules:/lib/modules:ro \
    -d --privileged \
    fcojean/l2tp-ipsec-vpn-server

如果重启之后,docker容器是默认退出的,这里由于没有做--restart=always的,所以重启之后要重新启用Container

docker start l2tp-ipsec-vpn-server

这里的服务名是根据docker ps查看出来的,即最后一列,这里查看的结果就是l2tp-ipsec-vpn-server


客户端

主要参考:https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md,里面所述的步骤

笔者测试是在属性里面,安全一栏选择可选加密,然后未加密的密码勾选上

如果拨号无法成功,那么需要添加一个注册表文件,内容如下

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent]
"AssumeUDPEncapsulationContextOnSendRule"=dword:00000002

首先用文本把上面的文字进行复制,然后将文件修改为*.reg格式,双击添加即可,其他移动客户端按照通常的配法即可,没太多需要注意的地方。


参考:

ppp:http://en.wikipedia.org/wiki/Point-to-Point_Tunneling_Protocol

l2tp: http://en.wikipedia.org/wiki/Layer_2_Tunneling_Protocol

pptp:http://en.wikipedia.org/wiki/Point-to-Point_Tunneling_Protocol

ipsec: http://en.wikipedia.org/wiki/IPsec

An Illustrated Guide to IPsec:  http://www.unixwiz.net/techtips/iguide-ipsec.html

gre:http://en.wikipedia.org/wiki/Generic_Routing_Encapsulation

ms-chap-v2破解:https://www.cloudcracker.com/blog/2012/07/29/cracking-ms-chap-v2/

strongswan: https://www.strongswan.org/docs/OSTD_2013.pdf

ISAKMP、IKE、IKEv1、IKEv2、NAT-Tranversal:http://security.hsr.ch/lectures/Information_Security_2/Vorlesungsunterlagen/04.6-IKE_Notes.pdf


0 0
原创粉丝点击