OpenVPN的Linux内核版,鬼魅的残缺 Prelude

首先向James yonan致敬!
其次吐个槽,这都12月份了,还打雷,看来这股冷空气威力不是一般的大啊,大气环流和气压都被它改变了,我仿
佛看到了热空气和雾霾被这股异常强大的寒潮挤压得像难民一样背井离乡....这对于我而言,意义十分重大,从下周一开始,我将告别短袖T恤,穿上衬衫
了...再次重申,我这个时候穿短袖真的不冷,我能坚持到5摄氏度穿短袖,真的不冷,我在7摄氏度的时候偶尔穿一次长袖是因为压力实在太大...

OpenVPN不好,代码简单却不好读,逻辑清晰却不好改,你明明知道该怎么改了,却迟迟下不了手...但是它对于我个人而言,有着不一般的意义。在我
2006年毕业以来(其实我那也不算什么毕业,和蓝翔差不多,可能还不如...)可以说只有两个和计算机网络技术相关的东西让我觉得意义重大,一个是
iptables,一个是OpenVPN,其它的都是延伸!
      
对于iptables而言,顺着它我摸到了Netfilter,进而是IP处理,ip_rcv,很简单的一个函数,netif_receive_skb,
这是顺着下去自然找到的,我不是科班出身,所以我不是那种死跟代码的人,因此要务就是学习怎么用它们,以及它们的发展历史,比如在0.01版本中它们是什
么样的,自然而然,IP路由便是囊中之物了,使用iproute2
utils也如探囊取物,iptables更是不在话下了,现在虽不能任性地说自己在Netfilter方面除了Rusty的圈子外舍我其谁,但起码自己
写module,甚至可以实现Yet another
stack了...对于OpenVPN,和iptables一样,引着我到了很多平时到不了的地方,在现实意义上,甚至比iptables的意义还大,起
码我现在住的房子以及我那可爱漂亮乖巧个性喜欢朵拉爱吃甜点的小小都和这个叫做OpenVPN的东西有关...不管怎么说,路都是一步步走出来的。

2007年,我和老婆还在长春,她参加了一个东北亚投资贸易博览会,担任翻译,拿来两瓶酒,从来没见过的酒,结果那种酒一喝就是好多年,这就是真露。后来
她去上海替人家考试(按照我写此文的环境,我应该用‘来上海’),回长春的时候,带回去了瓶沈永和黄酒,后来到了上海,只要出去吃饭,必然喝一瓶黄
酒...总之,路是一步步走出来的,加之我本来就是个特别怀旧念情的人,走过的路才显得弥足珍贵。
      
有的时候,离开一个情景,是一件很痛苦的事情,比如突然不喝酒,比如老丈人走了,吃火锅时明显快了很多,感觉像吃东北炖菜或者吃面...比如当年离开长
春,比如更远些,当年离开哈尔滨,离开星宇名座去南湖大路,离开154路公交车改坐轻轨...我是一个适应性很强的人,对周围的新环境不在乎,但是我确实
是一个对老环境忘不了的人,就在国庆前夕,我还让老婆开车带我去之前刚到上海时的住处去看了一下那里的物是人非,也许如果我到了意大利,会超越爱德华.吉
本吧,希望能,我看能。
      
时间啊时间,不够用,时间都TMD去哪了,此时是凌晨两点四十分,明显感觉时间不够...昨晚折腾OpenVPN折腾到4点,然后早上很早就起来去买菜
了,发誓做一次真正的火锅,结果做多了,没吃完,然后发誓一定要学会Python...Python要比OpenVPN好玩的多。不过在折腾Python
之前,还是先把OpenVPN弄进内核再说!
      
傻比一样的人发明了保护模式,同样智商的一批人将操纵系统划分为了用户态和内核态。当人们将越来越多的东西从内核态移植到用户态的时候,我反其道而行之,
我将OpenVPN这样的东西弄回内核态去...世界本来就是平坦的,事实证明等级划分与权限划分带来的不是安全而是愤怒。根本就不应该有什么内核态,用
户态,因此我将OpenVPN移植到内核态去实现其实只是一种优化方案罢了。正是由于分类才有了排他性,才使得一切好像都不能融会贯通,同时有了跨界这一
说,然而对于大多数人来讲,隔行如隔山,即便都是编程的,也分为搞应用的,写类的,写库的,写驱动的...
      
人们为何不喜欢IPSec,难道就因为它是内核实现的,维护成本高?NO!NO!NO!很显然,IPSec崩溃会将操纵系统一起带崩溃,但是频繁崩溃的
IPSec产品是怎么进入市场的呢?很显然,操纵系统升级要伴随IPSec升级,而用户态程序的生命周期会更长久,但这只能说明iPSec具体的实现在适
配方面做得不好,退一万步说,不是也可以在用户态实现IPSec吗?...根本原因是什么?我也不知道。但是我知道的是,OpenVPN在用户态实现以及
可以及时编译运行是一个优势,这导致了它极大的受众。然而将其移植进内核呢?那简直糟糕透顶啊,那将依赖内核,OpenVPN不是号称自己可以一套代码编
译在Linux,WinXP,Win7/8,XXXXBSD,MacOS,Android,iOS吗?它们的内核可都不一样啊...可是这对单台的服务器
而言又有何关系呢?一台高性能的服务器能服务5位数的用户,而我们触动的只有一台运行OpenVPN的机器以及其内核而已,算上热备,算上集群又如何,不
会超过10台机器吧,我们不会去碰触OpenVPN客户端实现,也不管它们是跑在Android手机,iPhone还是笔记本上,不管它是不是另一个网络
的出口...我将OpenVPN弄进内核的目的是为了让其更优化,这简直是一个正反馈系统!!因此,我又有什么错?!I am
right!别忘了,OpenVPN有一个天生的优势,那就是其server模式,它不是像IPSec那样的完全对等的节点,二是分出了主从,任何一个
OpenVPN组网方案中,只有一个中心服务器,这里面本来就蕴藏着很多的故事,能否挖掘出来就看个人了。这个不对等的关系完全可以造就像蚁后那样的
being,而进入内核的OpenVPN服务器,首先进入了候选名单。
       如果庞然大物已经向你走来,那么就要拿起你的鞭子了...

时间: 2024-10-09 19:21:26

OpenVPN的Linux内核版,鬼魅的残缺 Prelude的相关文章

OpenVPN的Linux内核版,鬼魅的残缺 part III rework with Netfilter

哥们儿拿到了juniper的offer,由衷祝福,酒足饭饱后的我,在Netfilter的路上却根本停不下来.已经是深夜,回忆这些年在Netfilter上的探索,结合目前的一些状况,突然觉得,既然我已经想把OpenVPN弄到内核了,那为何上一个鬼魅的实现没有使用Netfilter呢?当时我就觉得采用UDP的encap_rcv HOOK这种方式太鬼魅,又有些残缺,缺了什么却不知道,谁说没钱就不能任性,我当时可能就觉得:我就是不用Netfilter,我就是要用另一个方法!就好像上高中的时候,数学课上,

OpenVPN的Linux内核版,鬼魅的残缺 part II:The encrypt engine

一夜入冬啊一夜入冬,医院回来的路上已经困得不行了,不过还是仔细思考了我的OpenVPN内核版.和那些天天在微信朋友圈晒工作的相比我简直弱爆了,我 本应该说今天没有去上班,然后心里多么多么内疚的,什么耽误工作之类的,不过那不是我的style,就像我同样不喜欢在工位上贴大量的任务计划一样...       把本已不堪的OpenSSL移植到Linux Kernel,这真是一个疯狂的想法,极其疯狂的想法,过于疯狂的想法,以至于作为一个还算正常的人只好作罢!我需要的是使用现有的内核中的加密引擎或者 简单的

OpenVPN的Linux内核版,鬼魅的残缺 part IV:Normal Method

谁能在上海请我吃一顿烤全羊!又折腾了几乎个通宵...对于将OpenVPN弄进内核这件事,我已经找到了两个思路:1.使用UDP的encap rcv HOOK/tun xmit HOOK:2.使用Netfilter的PREROUTING HOOK分离控制通道和数据通道:但 是有个问题,那就是它们都仅仅对UDP有效,而OpenVPN虽不建议但是也是对TCP提供支持的.然而如果实现TCP模式的内核OpenVPN数据通道 处理,就必须在传输层之上来做,因为TCP必须要完成它自己的协议事务,比如确认,重传等

OpenVPN的Linux内核版,鬼魅的残缺 View

是时候给出一个总的图景了,是时候了.我的意思是说,为什么非要将OpenVPN移植到内核,而不是在用户态,即在它本身优化它.为什么呢?事实上我已经在用户态优化了它,虽然有些难以定位的segment fault,但是并不是说我没有时间没有能力搞定这些,知难而退到内核(退到内核碰到panic岂不是更难搞),不是这样的.我的本意是,且一直都是,我要缩短处理路径的长度,我从来都不相信什么软件神话,事实上我憎恨这些神话.正如一位网友所说,干嘛非要区分什么内核态,用户态!关键点不在哪个态处理效率高,关键在处理

OpenVPN的Linux内核版,鬼魅的残缺 part I:The PROTOCOL

OpenVPN的多处理一直都是问题,但是作为轻量级VPN,这无所谓,但是如果你要将其作为重量级VPN来用,那就必须考虑了.       之前,我将OpenVPN分裂成了多线程版本,但是由于OpenVPN原本的buffer管理粒度就很粗,以至于我很难在多个线程中能够同时处理一个 multi_instance,所以我不得不采用一个multi_instance绑定一个线程的做法,为此还特意实现了一个自己版本的多队列TUN网卡 已经UDP的hash reuseport机制,这一切耦合太紧密,以至于牵一发

关于linux内核2.4.xx 直接升级到 2.6.xx 版出现的问题

2.4.x 与 2.6.x 是两个具有相当大差异的核心版本, 两者之间使用到的函式库基本上已经不相同了,所以在升级之前,如果你的核心原本是 2.4.xx 版,那么就升级到 2.4.xx 版本的最新版,不要由 2.4.xx 直接升级到 2.6.xx 版,否则会出现很多未知的错误,直接导致系统不能使用. 关于linux内核2.4.xx 直接升级到 2.6.xx 版出现的问题,布布扣,bubuko.com

linux发行版和内核的关系

转自:http://m.blog.csdn.net/article/details?id=50595230 Linux内核是计算机操作系统的核心.一个完整的 Linux发行版包括了内核与一些其他与文件相关的操作,用户管理系统,和软件包管理器等一系列软件.每个工具都是整个系统的一小部分.这些工具通常都是一个个独立的项目,有相应的开发者来开发及维护. 前面提到的Linux内核,包括现行版本,以及历史版本(即更早发布的版本)都可以在 www.kernel.org 找到.Linux的众多发行版可能是基于

Linux内核LTS长期支持版生命周期

Longterm release kernels Version Maintainer Released Projected EOL 4.9 Greg Kroah-Hartman 2016-12-11 Jan, 2019 4.4 Greg Kroah-Hartman 2016-01-10 Feb, 2018 4.1 Sasha Levin 2015-06-21 Sep, 2017 3.18 Sasha Levin 2014-12-07 Jan, 2017 3.16 Ben Hutchings 2

Linux内核版本 uname命令 GNU项目 Linux发行版

1.内核版本由linux内核社区统一编码和发布,格式如下图: major.minor.patch-build.desc 主版本号.次版本号.对次版本号的修订次数-编译次数.当前版本的特殊信息 次版本号有奇数和偶数之分,奇数表示开发版,偶数表示稳定版 desc:常见参数EL(Red Hat企业版Enterprise Linux).pp(Red Hat测试版).fc(Red Hat中Fedorca Core).smp(对称多处理器).rc/r(候选版本,后面的数字越大越接近正式版) 2.uname