前面的《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,但是你的生活从此将不再简单,你也可以使用拨号,连接到远程,但是你永远无法体验完全接入这种身临其境的感觉。
OpenVPN协议解析 通道 状态机 Reliability层
OpenVPN通道
OpenVPN通道
OpenVPN内置了两个通道,一个用于控制,另一个用于数据传输,在设计上,很多网络协议都实现了多通道,也有N种方式实现多通道,其中常用的有两种,一种是使用带外数据传输控制信息,另一种就是将控制信息多路复用到数据通道。OpenVPN使用的就是第二种方式。
OpenVPN协议解析 握手数据包分析
学习一种协议的最好的方式就是研究它的数据包,这样可以加深对协议的理解。对于研究过某种协议数据包的家伙来讲,他一定知道协议头的哪个位置对应哪个字段,虽然这对于理解协议为什么这么设计可能没有太大的帮助,然而对于排查问题和实际实施是很有帮助的。既然很多人都对Richard Stevens的《TCP/IP详解》情有独钟,咱就剽窃他的风格,解析一下OpenVPN的握手是如何完成的。本文分析70余个数据包,当然,最终我会略去重复的内容,来看看OpenVPN的握手协商过程。