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
- PPTP和IPSEC/L2TP的VPN笔记
- VPN 隧道协议PPTP、L2TP、IPSec和SSLVPN的区别
- PPTP、L2TP、IPSec和SSL VPN 的区别
- PPTP、L2TP、IPSec和SSLVPN的区别
- VPN隧道协议PPTP、L2TP、IPSec和SSLVPN
- PPTP、L2TP、IPSec和SSL VPN(如OpenVPN)的区别
- PPTP、L2TP、IPSec和SSL VPN(如OpenVPN)的区别
- PPTP、L2TP、IPSec、SSL VPN、OpenVPN 区别
- PPTP、L2TP、IPSec、SSL VPN、OpenVPN 区别
- PPTP和L2TP/IPSEC和OPENVPN 的区别
- PPTP、L2TP和IPsec的区别及优缺点
- OpenVPN与PPTP、L2TP、IPSec的区别
- l2tp、IPsec、ssl VPN的区别
- PPTP、L2TP、IPSec和SSLVPN(典型应用OpenVPN)的区别
- 关于ppp、PPPoE、PPTP、L2TP、IPSec协议的简单认识
- IOS的IPsec/L2TP VPN 客户端配置-飞鱼链vpn
- CentOS 6下pptp+L2TP/IPSec vpn一键安装脚本
- 走向世界系列1: IPsec L2TP PPTP介绍与搭建vpn服务器
- 关于tp框架的方法返回值
- 事件分发机制(三)
- 2016ACM/ICPC亚洲区北京站现场赛直播地址
- react-02--Rendering Elements
- c++ std::atomic类型以及其memory order介绍
- PPTP和IPSEC/L2TP的VPN笔记
- WorkSheetsとSheetsの違い
- 责任链模式——请让处理者与请求者解耦
- hdu 2516 取石子游戏
- 初学Android-------跑马灯
- hdoj 1058 Humble Numbers (*)
- 银行 终极变态版
- ng-click 中写的表达式,能使用 JS 原生对象上的方法吗?
- 【直播】RMTP HLS直播延时问题因素