OpenVPN由于其设计问题,速度很慢,有人认为是由于加密解密导致了速度变慢,当将cipher设置成none之后,发现效率并没有提升,并且使用最慢的cipher,使用比较好的cpu,设置比较大的txqueuelen,使用比较快的网卡–100baseT-FD,OpenVPN的效率还是不行,cpu使用率没多少,那么可以认为提升cpu性能已经于事无补了,后来才发现是OpenVPN自身的问题,通过源代码看得出OpenVPN是一个单进程单线程的程序,整个程序启动后就是一个大的循环,结构如下:
OpenVPN高级路由技术 全面的互通性配置
本文全面介绍OpenVPN的路由配置,不再阐述理论。为了简单且不引入其它问题,以下的配置不考虑NAT。 零.介绍和声明以及拓扑图
- 以下的配置不再给出任何配置文件或者配置选项,比如iroute配置等;以下路由配置可以不使用默认网关,使用默认网关只是为了方便。正确的做法是配置指向确切网络的路由,变长掩码非0
- 由于OpenVPN支持tun和tap两种模式,在Tun中,路由指的是下一跳节点或者是一个虚拟网卡,在tap中,路由指的是从OpenVPN虚拟交换机出去的虚拟端口,这二者是截然不同的,协议也没有工作在同一个层,因此OpenVPN内部路由使用multi_instance代表这两者,tun模式中,multi_instance代表三层路由目标,tap模式中,multi_instance代表二层路由目标,即端口。 拓扑图如下:
OpenVPN高级路由技术 虚拟交换机和内部路由缓存
前面的《OpenVPN高级路由技术》系列文章阐述了OpenVPN中潜在的内部路由技术以及具体的配置方法,另外也谈到了如何使用OpenVPN将网络进行扩展,然而具体到这些内部路由是怎么工作的,并没有谈及。为什么直到现在才说这些呢?我以为最好先不要管内部原理,先要学会用,只有当你明白这是个黑盒子的时候,你才会有目的的想进入它,希望它成为你的白盒子。
OpenVPN的包过滤机制
OpenVPN是和网络结合的非常紧密的一款VPN,事实上,每一个VPN框架都和IP网络结合的很紧密,因此在此首先劝一下那些想搞VPN的朋友们,一定要先彻底精通TCP/IP网络协议栈,特别是IP路由,防火墙原理之后再去啃OpenVPN或者其它的VPN,否则会事倍功半的,仅仅看懂源代码和灵活配置,灵活运用,灵活定制之间的差距和很远,精通VPN远远不是会写C代码会使用哈希表就能应付得了的。
OpenVPN高级路由技术 反向推送信息
在《VPN的概念以及要点》中,我指出了OpenVPN构建的网络是单向的,也就是说在不手工配置系统路由的情况下,只能由OpenVPN客户端一侧发起连接。这是因为OpenVPN服务器会把自己一侧的路由推送至OpenVPN客户端,反之,OpenVPN客户端却不能把自己一侧的路由推送给OpenVPN服务器。于是我自己修改代码手工实现了一个PUSH消息,将客户端的信息放在PUSH_REQUEST的后面进行发送,然后OpenVPN服务器端进行解析。此举改动了大量的代码,浪费了我一天无聊的时间…
有什么更直接的方式么?事实上,当你认为没有的时候,蓦然回首,那人正在灯火阑珊处等你呢。如果你执行openvpn –help的时候,你会发现一个很有趣的选项,那就是push-peer-info选项,正如help解释所说,它只能用于client。该选项的含义是将OpenVPN客户端的信息推送至OpenVPN服务器。那么赶紧试试看。
OpenVPN高级路由技术 扩展成巨大的网络
OpenVPN内部实现了一个路由器的功能,其源代码的multi_get_instance_by_virtual_addr函数执行路由查找的工作,这种路由是OpenVPN的内部路由,也就是说这种路由是OpenVPN配置并查找的,和外部的系统路由是完全独立的。
OpenVPN的高级路由技术 内部路由
server模式以及点对点模式的OpenVPN
前文好几次说过,虽然OpenVPN也可以创建隧道,该隧道封装了IP数据报或者以太帧,然而却和使用IPSec VPN的网络拓扑无法做到兼容,这是因为在网对网模式下,默认配置下,使用tun虚拟网卡模式的OpenVPN的客户端虚拟网卡上要强制做SNAT,否则便通不过OpenVPN服务器端的检查。这是因为OpenVPN服务器是根据分配给客户端的虚拟IP地址来维护客户端和自己保存的session(也就是multi_instance)的对应关系的。为了定位是哪个客户端发来了封装的数据包,OpenVPN需要解析出封装载荷中的源IP地址,从而找到和自己保存的multi_instance的对应关系。初看起来,这好像是OpenVPN服务器设计时端偷了一个懒,然而下一节会说明,事实并不是那样。
使用OpenVPN的桥接模式扩展内部局域网
背景
OpenVPN是一款高度可扩展的VPN软件,除了既有的将应用客户端安全接入服务器这一传统功能外,还可以让你无缝的接入一个远程的局域网,正如你身在该局域网一样,如果你不用OpenVPN,你将很难做到这一点。当然,你可以选择像IPSec这样的重量级VPN,但是你的生活从此将不再简单,你也可以使用拨号,连接到远程,但是你永远无法体验完全接入这种身临其境的感觉。