快捷搜索:

Linux 下应用层ipsec Vpn的实现

做VPN很多年了,和Linux也打交道很多年了,不停想把自己的一些履历总结下来,可是不停没有光阴。正巧近来做新的VPN项目,就收拾一下自己的思路,把VPN在linux下的实现前因效果写清楚,在此和各位感兴趣的同伙一同交流。

VPN有链路层,收集层和用户层:

链路层的L2TP vpn 或者 MPLS vpn等这里就不做描述了。

用户层VPN今朝基础都是SSL vpn, SSL VPN强调的上风着实主要集中在VPN客户真个支配和治理上,我们知道SSL VPN频频强调无需安装客户端,主如果因为浏览器内嵌了SSL协议,也便是说是基于B/S布局的营业时,可以直接应用浏览器完成SSL的VPN建立; 某些SSL VPN厂商有类似IPSec VPN的“收集造访”要领,可以办理传统的C/S利用法度榜样的问题,用户用浏览器登录SSL VPN设备后,拨通收集造访资本即可得到一个虚拟IP,即可以造访按照安然策略容许造访的内网地址和端口,和IPSec VPN不合的是,这种要领并非事情在收集层,以是不会有接入地点的限定;

针对上面的两种利用我们可以看出,一种是适用采纳ssl实现https协议,别的一种便是将所有利用的收集层IP报文封装在ssl中传输。第一种要领可以采纳ssl socket轻松实现,比如openssh,stunnel,HTTPS等。第二种的实现要领今朝基础上都按照OPENVPN思路,openVPN所有的通信都基于一个单一的IP端口,默认且保举应用UDP协议通讯,同时TCP也被支持。OpenVPN连接能经由过程大年夜多半的代理办事器,并且能够在NAT的情况中很好地事情。办事端具有向客户端“推送”某些收集设置设置设备摆设摆设信息的功能,这些信息包括:IP地址、路由设置等。OpenVPN供给了两种虚拟收集接口:通用Tun/Tap驱动,经由过程它们,可以建立三层IP地道,或者虚拟二层以太网,后者可以传送任何类型的二层以太收集数据。

收集层的ipsec vpn,开源的资料就对照多了,最主要的便是freeswan及其衍生版本。但这些都是涉及到内核的改动,用户层进行密钥协商,内核进行报文封装和解封,详细协议细节就不再论述,网上这方面资料很多。

作为这个专题,主要先容Linux用户层实现ipsec vpn 报文封装和解密的几种思路和对照。

1. 采纳用户层协议栈实现ipsec vpn 网关,所有收支报文从内核层协议栈—用户层协议栈转来转去。这种要领核心便是从采纳raw socket,pf_packet进行报文的捕获和发送。有光阴的话我收拾一个具体的思路给大年夜家,这种实现完全自立,对编程,设计要求较高。

2. 采纳openvpn的TUN/TAP思惟,TUN/TAP虚拟收集设备的道理对照简单,他在Linux内核中添加了一个TUN/TAP虚拟收集设备的驱动程式和一个和之相干系的字符设备/dev/net/tun,字符设备tun作为用户空间和内核空间互换数据的接口。当内核将数据包发送到虚拟收集设备时,数据包被保存在设备相关的一个行列步队中,直到用户空间程式经由过程打开的字符设备tun的描述符读取时,他才会被拷贝到用户空间的缓冲区中,其效果就相称于,数据包直接发送到了用户空间。经由过程系统调用write发送数据包时其道理和此类似。懂得这些就不难实现用户层ipsec vpn了,用户层 read已加密包和待加密的报文进行解密或加密,然后write出去就可以,所有报文的路由都有内核协议栈来实现。实现思路和碰到的问题将在后面进行描述。

3. 应用netlink进行用户层和内核层进行交互,内核层netfilter供给一系列的HOOK,用户可以自己挂在函数在hook进行报文出来,处置惩罚的结果有一种叫NF_QUEUE,将报文通报到用户态去做进一步的处置惩罚。用户层处置惩罚(反省,改动)后经由过程消息奉告netfilter 若何处置惩罚这个报文。这中实现技巧路线要求对netfilter的布局要相称认识,否则报文无法正常路由。

着末将对这三种实现要领进行总结,对照可行性(机能,操作等)。

本人写文章爱好东拼西凑,以是文章很多内容都是是从网上直接copy过来,关键的地方我会标注其出处,在此谢谢那些对开源天下作出供献的人们。

您可能还会对下面的文章感兴趣: