BadVPN详解之--题外话:我之前自研的一个设计
来源:互联网 发布:国画淘宝梅花挂客厅 编辑:程序博客网 时间:2024/06/16 18:42
说实话,这个与BadVPN无关,是我去年年初时想的一个东西,只是觉得与BadVPN类似就单列一篇文章来说,在看到BadVPN之前,我一直都想用这个思路来重构OpenVPN,无奈场面过于宏大,加之工作又再也与VPN无关,就一直搁置了,现在知道了有BadVPN这个东西,我也就再也没有必要去想这个事了,就当是个了结吧。我把我去年自研的基于OpenVPN的重构思路在本文中阐述一下,本文中我把我的这个VPN叫做ZyVPN,其实它是基于OpenVPN改的。
参照Cisco EzVPN的思路,ZyVPN引入一个控制节点,负责接入控制,地址分配,路由推送,策略推送,地址学习Cache等,这个控制节点其实就是去掉了数据通道支持的OpenVPN服务端,数据通道被彻底分离出来,这也降低了OpenVPN的协议设计复杂度,可是说是OpenVPN的成功瘦身减负。ZyVPN总框图如下所示:
A接入VPN网络:
本地邻居表在结构上和BadVPN也是一致的,但是在用法上和BadVPN的还是有区别的,在BadVPN中,子节点依靠以太帧的MAC地址和节点ID的关系来判断这个帧要发给谁:
这确实是一种合理的方式,以太网交换机就是这么做的,但是BadVPN构建的只是一个虚拟的二层网络,它事实上是Ethernet over UDP的,虽然FLOOD方式很合理,但这优雅吗?无论怎样,即便不优雅,这就是BadVPN的处理方式,作者肯定会给出他之所以这么设计的理由,而我的ZyVPN则采用了一种完全不同的方式来对付此事。
我引入了一个Cache层,这就是第三张表,即控制中心的中心邻居表,出现查找本地邻居表未果时,将帧发给控制中心,由它来决定该如何做。
我的理由是,尽量避免在规模比较大的网络上进行FLOOD,而我们知道BadVPN,ZyVPN可以构建于任意规模的TCP/IP网络之上。所以说,我希望引入一个新的Cache层,试图减缓FLOOD对带宽带来的冲击。最终ZyVPN的三级Cache体系的逻辑就是:
1.首先查本地的邻居表
2.如果邻居表找不到就发往控制中心,查找中心邻居表
3.控制中心的中心邻居表也没找到再由控制中心来FLOOD(FLOOD的数据帧要加上FLOOD标记,以便反向数据帧副本发挥控制中心供其学习)
4.返回的结果首先返回给控制中心,控制中心学习其到中心邻居表
加入了控制中心的邻居表这个Cache层之后,将会大大减少FLOOD的数量。
下面是一个情景分析:
打住!当你看了上面的情景分析后,可能会有个疑问。A怎么可能往MacX发数据而不知道它在节点C呢?数据帧发送前不是有个ARP过程,ARP回应时,照理说A就应该能学习到MacX了吧?!确实这是事实,但是我上面的分析仅仅是举一个例子,不是通用场景,要知道ARP和邻居表并没有必然的关联,也并不是说邻居解析一定会有ARP,比如静态配置的IP/MAC映射怎么办?
但不管怎样吧,在设计上,我的思路与BadVPN出奇的一致,而且我的降Flood的中心邻居表要比BadVPN更酷,至少我个人是这么认为的。我现在的问题是,为什么我的ZyVPN和BadVPN这么像?其实原因很简单,因为正确的道路往往只有一条,引用《安娜.卡列尼娜》里说的那句经典:幸福的人都是相似的,不幸的人各有各的不幸。唉,这句话在我们中国人眼里就变成了英雄所见略同。其实与英不英雄,是不是猛士无关,即便草根走在正确的道路上,那也是一条正道。
总览
有了前面对BadVPN和OpenVPN的介绍以及比较,我在介绍我的ZyVPN时就简单多了,因为我的这个版本可以看成是从OpenVPN到BadVPN的过渡版本。当然也可以看成是一个OpenVPN的Bugfix版本,属于那种见招拆招的方案,主要是为了解决主从模式的OpenVPN点对点对等组网问题。参照Cisco EzVPN的思路,ZyVPN引入一个控制节点,负责接入控制,地址分配,路由推送,策略推送,地址学习Cache等,这个控制节点其实就是去掉了数据通道支持的OpenVPN服务端,数据通道被彻底分离出来,这也降低了OpenVPN的协议设计复杂度,可是说是OpenVPN的成功瘦身减负。ZyVPN总框图如下所示:
可以看到,中心节点已经不再承受数据。
ZyVPN的三张表
BadVPN中有两张表,分为控制节点的接入表和VPN子节点的邻居表。ZyVPN里也一样有这两张表,这个跟BadVPN几乎完全一致。它们的结构和相关过程如下,我依然用A,B,C三个节点接入的情景来展示:A接入VPN网络:
本地邻居表在结构上和BadVPN也是一致的,但是在用法上和BadVPN的还是有区别的,在BadVPN中,子节点依靠以太帧的MAC地址和节点ID的关系来判断这个帧要发给谁:
这确实是一种合理的方式,以太网交换机就是这么做的,但是BadVPN构建的只是一个虚拟的二层网络,它事实上是Ethernet over UDP的,虽然FLOOD方式很合理,但这优雅吗?无论怎样,即便不优雅,这就是BadVPN的处理方式,作者肯定会给出他之所以这么设计的理由,而我的ZyVPN则采用了一种完全不同的方式来对付此事。
我引入了一个Cache层,这就是第三张表,即控制中心的中心邻居表,出现查找本地邻居表未果时,将帧发给控制中心,由它来决定该如何做。
我的理由是,尽量避免在规模比较大的网络上进行FLOOD,而我们知道BadVPN,ZyVPN可以构建于任意规模的TCP/IP网络之上。所以说,我希望引入一个新的Cache层,试图减缓FLOOD对带宽带来的冲击。最终ZyVPN的三级Cache体系的逻辑就是:
1.首先查本地的邻居表
2.如果邻居表找不到就发往控制中心,查找中心邻居表
3.控制中心的中心邻居表也没找到再由控制中心来FLOOD(FLOOD的数据帧要加上FLOOD标记,以便反向数据帧副本发挥控制中心供其学习)
4.返回的结果首先返回给控制中心,控制中心学习其到中心邻居表
加入了控制中心的邻居表这个Cache层之后,将会大大减少FLOOD的数量。
下面是一个情景分析:
打住!当你看了上面的情景分析后,可能会有个疑问。A怎么可能往MacX发数据而不知道它在节点C呢?数据帧发送前不是有个ARP过程,ARP回应时,照理说A就应该能学习到MacX了吧?!确实这是事实,但是我上面的分析仅仅是举一个例子,不是通用场景,要知道ARP和邻居表并没有必然的关联,也并不是说邻居解析一定会有ARP,比如静态配置的IP/MAC映射怎么办?
ZyVPN与BadVPN的其它不同
我这个ZyVPN本质上还是从OpenVPN改来的,还带着OpenVPN的影子,比如:1.ZyVPN依然支持TAP和TUN两种组网方式
而BadVPN则直接去掉了TUN的支持,这样BadVPN节点之间就构成了一个大二层的VPN虚拟网络。2.ZyVPN依然支持控制节点向子节点的推送机制
BadVPN不支持推送,也就是说所有的关于虚拟子网的任何配置都要在各个子节点上一一各自配置,我们也可以看出,BadVPN的TAP网卡的配置并非是BadVPN的一部分,需要你自己来配置。这些也许是BadVPN的一个使用上的限制,然而增加策略推送机制并不是什么难事。英雄所见略同?
我不敢说自己的本事有多大,但事实证明我的ZyVPN和BadVPN非常类似,我只是编程编的不好,所以我只能基于现成的OpenVPN来修改,让我用自己的代码把自己的设计重新来写,我没那能力,所以我还是借力了OpenVPN...但不管怎样吧,在设计上,我的思路与BadVPN出奇的一致,而且我的降Flood的中心邻居表要比BadVPN更酷,至少我个人是这么认为的。我现在的问题是,为什么我的ZyVPN和BadVPN这么像?其实原因很简单,因为正确的道路往往只有一条,引用《安娜.卡列尼娜》里说的那句经典:幸福的人都是相似的,不幸的人各有各的不幸。唉,这句话在我们中国人眼里就变成了英雄所见略同。其实与英不英雄,是不是猛士无关,即便草根走在正确的道路上,那也是一条正道。
2 0
- BadVPN详解之--题外话:我之前自研的一个设计
- BadVPN详解之--编译与运行
- BadVPN详解之--组网原理剖析
- 题外话: 一个网络创业的论坛
- BadVPN详解之--始记:透明socks代理与tun2socks
- BadVPN详解之--始记:透明socks代理与tun2socks
- 自学HTML之题外话
- automation02--值得一提的题外话
- 题外话
- 题外话
- 题外话
- 题外话
- 设计一个站点之前想到的
- jolfe的安卓之旅_05题外话之执行力
- 可怜的镯儿她哥——之题外话
- 从零开始学习C++6.0之并口控制-关于3D打印机的题外话
- 题外话:一个调查问卷--您可以正常休假吗?
- 我之前的博客地址
- 保障MySQL安全的十四个最佳方法
- 一. Scala安装与环境配置
- 位运算符 和MySQL运算符的优先级
- maven build 无反应,直接terminated
- Junit4-使用JUnit4
- BadVPN详解之--题外话:我之前自研的一个设计
- Android自定义Dialog
- RFID实验三总结
- getInstance和newInstance
- IMWeb训练营作业2-SELECT组件
- Spring事务传播行为
- C++ 多线程读取Excel技术分析
- Google Code Jam 2017 Round 1B [B-large不会]
- Java中Class.forName和ClassLoader.loadClass的区别