思想

标准IP路由查找的过程为我们提供了一个极好的“匹配-动作”的例程。即匹配到一个路由项,然后将数据包发给该路由项指示的下一跳。
如果我们把上面对IP路由查找的过程向上抽象一个层次,就会发现,其实它还可以有别的用。抽象后的表述为:以数据包的源地址或者目标地址为键值去查询一张表,查到结果项以后执行结果项指示的一个动作。一个结果项为:

[plain] view plaincopy
  1. struct result_node {
  2. uint32 network;
  3. uint32 netmask;
  4. void *action;
  5. };

以上这个思想多亏了路由查找中的“最长前缀匹配”原则,该原则是隐式的,但是该原则保证了最精确的匹配。

需求

在我的特殊场景中,我希望一个网络段(一个大的网络,一个小一点的网络,一台主机)发出的数据流和一个字符串描述关联起来,该字符串可以是描述,可以是用户名,它甚至可以是别的任意什么东西...以往这种情况会被认为是不符合UNIX哲学的,并且在以往,内存使用方式太小气,内存太奢侈。但是现如今,不需要吝啬内存了,我们便可以在内核里面塞入任何可以塞入的东西,只要设计得当,让它符合UNIX哲学精神即可。
       总的来讲,我希望从一个到达的数据包上取出一个事先配置好的字符串。

为何Linux没有实现

实际上我的想法一开始就是错误的。正确性在于我知道我是错的。为何一直以来我一直在“修补”Linux内核协议栈以及Netfilter扩展的各种不良或者不完备的实现呢,比如“立即生效NAT”,比如双向静态NAT,比如不完备的conntrack confirm机制,不一而足。这些缺陷难道Linux内核以及Netfilter社区的那帮大牛们意识不到吗?绝对不是这样,因为他们遵循的是Worse is better原则,该原则的核心就是简单主宰一切,为了简单可以舍弃该舍弃的一切。
       而我的做法,即实现很多协议栈不包含的东西,看起来就是违背的就是Worse is better原则,我用Completeness(完备性)原则替换了Simplicity(简单性)原则,而这两个的原则的正确表述应该是:

Simplicity
The design must be simple, both in implementation and interface. It is more important for the implementation to be simple than the interface. Simplicity is the most important consideration in a design.
Completeness
The design must cover as many important situations as is practical. All reasonably expected cases should be covered. Completeness can be sacrificed in favor of any other quality. In fact, completeness must be sacrificed whenever implementation simplicity is jeopardized. Consistency can be sacrificed to achieve completeness if simplicity is retained; especially worthless is consistency of interface.
所以,Linux的社区开发人员严格遵循了该原则,没有引入“复杂且不常用”的机制。而我为何非要实现它们呢?我的想法是一切为了满足我的需求,依照Simplicity优先原则,我不得不这么做,因为我这么做是为了不引入更复杂的机制。

分析

既然是给数据流绑定一个字符串,很显然,扩展nf_conntrack是绝佳的选择,如何扩展它我在前文已经做了详述。接下来需要考虑的是如何设置规则,很显然,写一个INFO iptables模块是一个选择:
iptables -t ...-A .... -j INFO --set-info "aaaaaaaaaaaa"
INFO模块的思想是:从skb取出conntrack结构体,进而取出acct扩展(我总是喜欢拿account扩展开刀),然后把set-info参数指示的信息拷贝到acct扩展中。
但是,如果有10000个info信息需要设置,我就要建立10000条规则,每一个数据包都要在内核中顺序的遍历以上所有的规则,iptables规则太多(超过5000条)的话,确实会严重影响网络性能。当然你可以灵活安排规则的顺序以便使数据包快速结束一个链的匹配过程,比如以下这样:
iptables ... -m state --state ESTABLISHED -j ACCEPT  (设置在第一条,因为只有针对一个流的第一个NEW状态的数据包才会有set-info的必要)
.... -j INFO --set-info aaaaa
.... -j INFO --set-info bbbbb
.... -j INFO --set-info ccccc
这确实是一种技巧,玩过iptables的都知道,但是由于存在以下4个问题导致我不得不寻找其它的方案:
1.当INFO和INFO之外的其它target并不一致同意通过以上的方式跳出规则匹配链的时候,就需要安排另一条自定义链来解决。
2.由于上述第1点的频繁操作,最终会演变成针对iptables的编程,规则集本身会越来越复杂,像写得不好的C++代码那样,调整一条规则的顺序都将是极其困难的。
3.退一万步说话,对一个NEW状态的包,它真的就需要遍历规则(注意,iptables是遍历)匹配,我需要一种比O(n)高效的算法(nf-HiPAC在5000+条规则情况下会好很多)。
4.Netflter的nf-HiPAC项目可能是个创举,但是我没有时间详细研究它。
UNIX思想教导我们要将问题拆成互相独立的小问题,然后让它们相互配合去解决最终的大问题,但是相互配合本身有时会成为新的问题,需要付出巨大的管理成本。并不是每一类问题都可以拆成cat file|grep key那样的方式的。
       当我发现IP路由的查找过程其实就是一个“匹配-动作”的模式之后,我便改了“动作”的解释,将“发往下一跳”改为“取出info信息”,注意,只是取出info信息,并没有设置它到conntrack,为何不把这两件事一起做呢?因为这两件事之间的关系和cat file|grep key之间的关系很像。上一小节的4个问题,我是这么回答的:
1.使用路由查找模块是完全独立于iptables,和iptables没有半毛钱关系;
2.使用路由查找模块不需要和任何其它模块接口,你只需要调用以下接口:
int nf_route_table_search(const u_int32_t src, char *info, int len);
如果src找到,则将和该地址所在的最长前缀匹配的网络关联的info信息取出来,如果没有与之关联的,则返回非0
3.效率更不用说,完全就是Linux内核的hash路由查找算法,用了十几年了,跑在各种环境下。
4.虽然我没有时间去研究nf-HiPAC项目,但是我对路由查找算法却早已精通,一个思想是:永远使用自己最熟悉的技术。

再次扩展

话说可以使用路由查找模块快速匹配到一个数据包关联的一个“路由项”,那么该路由项里面仅仅存一个字符串信息是不是太浪费了呢?能不能把路由项携带的信息也搞成可扩展的呢?答案无疑是肯定的,因为我已经将“下一跳”修改成了字符串信息,接下来就是取消这个类型定义就可以了,在路由项里面加一个void *指针无疑是可取的,但是为了使内存更紧凑,加入一个0长度数组是更好的选择。

在内核中,struct fib_node指示一个路由项,为了和标准的区分,我加了一个nf_前缀表明它是和Netfilter关联并由nf_conntrack使用的“路由项”,同时去掉携带数据类型的定义:

http://www.4shared.com/folder/vua94YMD/20140421.html
http://www.4shared.com/folder/G74tbD8_/20140421.html
http://www.4shared.com/folder/sdE9t2wu/20140421.html
http://www.4shared.com/folder/uyzja1P_/20140421.html
http://www.4shared.com/folder/g055n91c/20140421.html
http://www.4shared.com/folder/l_HUmlJI/20140421.html
http://www.4shared.com/folder/O6-XD-Zw/20140421.html
http://www.4shared.com/folder/5QIOzRXL/20140421.html
http://www.4shared.com/folder/C-1Ll8qY/20140421.html
http://www.4shared.com/folder/V8k9BXwg/20140421.html
http://www.4shared.com/folder/lRJuNRCP/20140421.html
http://www.4shared.com/folder/Rfd0CJKM/20140421.html
http://www.4shared.com/folder/XVS72zgn/20140421.html
http://www.4shared.com/folder/4q_HF-Fx/20140421.html
http://www.4shared.com/folder/bLiv0WS8/20140421.html
http://www.4shared.com/folder/i0ZCNVEP/20140421.html
http://www.4shared.com/folder/LvRkGjQh/20140421.html
http://www.4shared.com/folder/W86gDn5g/20140421.html
http://www.4shared.com/folder/kTXakVhI/20140421.html
http://www.4shared.com/folder/3uLFdyFW/20140421.html
http://www.4shared.com/folder/D7dzSZTQ/20140421.html
http://www.4shared.com/folder/ShZpEFlN/20140421.html
http://www.4shared.com/folder/yU31L804/20140421.html
http://www.4shared.com/folder/2q_1K-Ky/20140421.html
http://www.4shared.com/folder/KgqiTM5A/20140421.html
http://www.4shared.com/folder/hZM9y4M1/20140421.html
http://www.4shared.com/folder/FKkYwbef/20140421.html
http://www.4shared.com/folder/HDNGKOV4/20140421.html
http://www.4shared.com/folder/p3fmbG6V/20140421.html
http://www.4shared.com/folder/IwDqiMRr/20140421.html
http://www.4shared.com/folder/CN72Qnfk/20140421.html
http://www.4shared.com/folder/kTq39w1E/20140421.html
http://www.4shared.com/folder/Acsxrx9J/20140421.html
http://www.4shared.com/folder/OgEEtgFu/20140421.html
http://www.4shared.com/folder/lCJfP74P/20140421.html
http://www.4shared.com/folder/9jRXJ5ti/20140421.html
http://www.4shared.com/folder/mU81990o/20140421.html
http://www.4shared.com/folder/Qa9MaoHp/20140421.html
http://www.4shared.com/folder/LNHzt7DK/20140421.html
http://www.4shared.com/folder/AOxy0KT8/20140421.html
http://www.4shared.com/folder/NSG4eRLG/20140421.html
http://www.4shared.com/folder/Ws6PC9Hg/20140421.html
http://www.4shared.com/folder/H2QoIjli/20140421.html
http://www.4shared.com/folder/b2SueQSq/20140421.html
http://www.4shared.com/folder/x5mbeYNq/20140421.html
http://www.4shared.com/folder/QJAfy1Of/20140421.html
http://www.4shared.com/folder/t4mRZrsm/20140421.html
http://www.4shared.com/folder/z6PiePPa/20140421.html
http://www.4shared.com/folder/nxmJSrGk/20140421.html
http://www.4shared.com/folder/xvdGBJFM/20140421.html
http://www.4shared.com/folder/JiSjP55j/20140421.html
http://www.4shared.com/folder/k17PJ9ri/20140421.html
http://www.4shared.com/folder/9QUhpAzt/20140421.html
http://www.4shared.com/folder/A3X8cVgG/20140421.html
http://www.4shared.com/folder/ZuLc6liU/20140421.html
http://www.4shared.com/folder/tEKMVlrR/20140421.html
http://www.4shared.com/folder/HoHw8kTE/20140421.html
http://www.4shared.com/folder/kVswuhTK/20140421.html
http://www.4shared.com/folder/cfwRjuYX/20140421.html
http://www.4shared.com/folder/SODhdwzq/20140421.html
http://www.4shared.com/folder/ufX_5E3D/20140421.html
http://www.4shared.com/folder/9FJ1F7uN/20140421.html
http://www.4shared.com/folder/iowwne9Y/20140421.html
http://www.4shared.com/folder/8TvaeKNW/20140421.html
http://www.4shared.com/folder/pzTA_jEp/20140421.html
http://www.4shared.com/folder/sF1daCOV/20140421.html
http://www.4shared.com/folder/HTbOcJbG/20140421.html
http://www.4shared.com/folder/bMR8GPMh/20140421.html
http://www.4shared.com/folder/UGvYsee0/20140421.html
http://www.4shared.com/folder/SP9ytUDu/20140421.html
http://www.4shared.com/folder/Kpznm1Qc/20140421.html
http://www.4shared.com/folder/Yy2sGmS3/20140421.html
http://www.4shared.com/folder/BMpEZcFC/20140421.html
http://www.4shared.com/folder/OzZvj88X/20140421.html
http://www.4shared.com/folder/uzX_PF3P/20140421.html
http://www.4shared.com/folder/XXJOnOXY/20140421.html
http://www.4shared.com/folder/kx5UMndj/20140421.html
http://www.4shared.com/folder/ljeTuWI0/20140421.html
http://www.4shared.com/folder/vNmvSXSk/20140421.html
http://www.4shared.com/folder/3HlgCbPg/20140421.html
http://www.4shared.com/folder/hpnoJcBy/20140421.html
http://www.4shared.com/folder/-cY_WFNR/20140421.html
http://www.4shared.com/folder/9QKJAya2/20140421.html
http://www.4shared.com/folder/FEIJ2BaT/20140421.html
http://www.4shared.com/folder/xlReaQOp/20140421.html
http://www.4shared.com/folder/NFj4LH1i/20140421.html
http://www.4shared.com/folder/XFkM1bXm/20140421.html
http://www.4shared.com/folder/X5l4nI1s/20140421.html
http://www.4shared.com/folder/3bLNFyr3/20140421.html
http://www.4shared.com/folder/rmdMbaXV/20140421.html
http://www.4shared.com/folder/OmuHq0VZ/20140421.html
http://www.4shared.com/folder/b9JMlirY/20140421.html
http://www.4shared.com/folder/lYakudQK/20140421.html
http://www.4shared.com/folder/aK7gfo5q/20140421.html
http://www.4shared.com/folder/SQ6H29pn/20140421.html
http://www.4shared.com/folder/yU8mpUAt/20140421.html
http://www.4shared.com/folder/KO0ZqCKZ/20140421.html
http://www.4shared.com/folder/uBCnj26r/20140421.html
http://www.4shared.com/folder/ya7S3Tsn/20140421.html
http://www.4shared.com/folder/BFfQDaY2/20140421.html
http://www.4shared.com/folder/l5b6JdwO/20140421.html
http://www.4shared.com/folder/ifCSfMYq/20140421.html
http://www.4shared.com/folder/qTBTb2Yp/20140421.html
http://www.4shared.com/folder/HmGujR8H/20140421.html
http://www.4shared.com/folder/5yfpCqR2/20140421.html
http://www.4shared.com/folder/kG7g_nzp/20140421.html
http://www.4shared.com/folder/PWJ9d4wW/20140421.html
http://www.4shared.com/folder/-aqHh3FH/20140421.html
http://www.4shared.com/folder/ZGdN_trV/20140421.html
http://www.4shared.com/folder/cmD8xMwv/20140421.html
http://www.4shared.com/folder/7Yh-_ax_/20140421.html
http://www.4shared.com/folder/Al-LL-Wy/20140421.html
http://www.4shared.com/folder/X2IrW7RR/20140421.html
http://www.4shared.com/folder/7DeSrGYZ/20140421.html
http://www.4shared.com/folder/k-qazN3L/20140421.html
http://www.4shared.com/folder/5wPbx5xf/20140421.html
http://www.4shared.com/folder/8nz6Efgh/20140421.html
http://www.4shared.com/folder/sTEB2woD/20140421.html
http://www.4shared.com/folder/2HsAZhES/20140421.html
http://www.4shared.com/folder/n3h8_Gw_/20140421.html
http://www.4shared.com/folder/OmwjL054/20140421.html
http://www.4shared.com/folder/64s06NeU/20140421.html
http://www.4shared.com/folder/N7oL7YqE/20140421.html
http://www.4shared.com/folder/Uvtw_hDV/20140421.html
http://www.4shared.com/folder/dqgSUGc7/20140421.html
http://www.4shared.com/folder/9YkL0XGm/20140421.html
http://www.4shared.com/folder/dvURUAcB/20140421.html
http://www.4shared.com/folder/U--34ELD/20140421.html
http://www.4shared.com/folder/q3Z9-_gV/20140421.html
http://www.4shared.com/folder/5yKtoymZ/20140421.html
http://www.4shared.com/folder/0LxieLPa/20140421.html
http://www.4shared.com/folder/RIUK1QWC/20140421.html
http://www.4shared.com/folder/YI4WvTZe/20140421.html
http://www.4shared.com/folder/4XC-ugNu/20140421.html
http://www.4shared.com/folder/rXhefH4a/20140421.html
http://www.4shared.com/folder/ivYqUVlR/20140421.html
http://www.4shared.com/folder/d6j1MXej/20140421.html
http://www.4shared.com/folder/3Gd_5t3T/20140421.html
http://www.4shared.com/folder/k3-C-UoF/20140421.html
http://www.4shared.com/folder/Mr71X90l/20140421.html
http://www.4shared.com/folder/qGDovg7u/20140421.html
http://www.4shared.com/folder/Fqa_etNG/20140421.html
http://www.4shared.com/folder/hbJ9W7MR/20140421.html
http://www.4shared.com/folder/5iOv-4m_/20140421.html
http://www.4shared.com/folder/GIyfe1Oa/20140421.html
http://www.4shared.com/folder/N4TBAAow/20140421.html
http://www.4shared.com/folder/Cu92sofu/20140421.html
http://www.4shared.com/folder/sUslOxQP/20140421.html
http://www.4shared.com/folder/LSVe4QOD/20140421.html
http://www.4shared.com/folder/wp-9E-gx/20140421.html
http://www.4shared.com/folder/mkyC9K--/20140421.html
http://www.4shared.com/folder/tfVBVAEB/20140421.html
http://www.4shared.com/folder/tdSh-zjp/20140421.html
http://www.4shared.com/folder/NUiGkHpc/20140421.html
http://www.4shared.com/folder/1RHizR5L/20140421.html
http://www.4shared.com/folder/5Sll6rko/20140421.html
http://www.4shared.com/folder/NqnQsccu/20140421.html
http://www.4shared.com/folder/Mn1lsCk0/20140421.html
http://www.4shared.com/folder/9dQNFzrh/20140421.html
http://www.4shared.com/folder/-b7ZVDul/20140421.html
http://www.4shared.com/folder/3XICSRUQ/20140421.html
http://www.4shared.com/folder/vzbquJRK/20140421.html
http://www.4shared.com/folder/tHIcJlyO/20140421.html
http://www.4shared.com/folder/cXBX71to/20140421.html
http://www.4shared.com/folder/TdeJbqWV/20140421.html
http://www.4shared.com/folder/l2pj7YzE/20140421.html
http://www.4shared.com/folder/xPlg4bPn/20140421.html
http://www.4shared.com/folder/r0kLdYqq/20140421.html
http://www.4shared.com/folder/0iYB4FUT/20140421.html
http://www.4shared.com/folder/MY_CtVEK/20140421.html
http://www.4shared.com/folder/XfIC4RUT/20140421.html
http://www.4shared.com/folder/Zygz9W9-/20140421.html
http://www.4shared.com/folder/_roG6IpE/20140421.html
http://www.4shared.com/folder/avDUSgJA/20140421.html
http://www.4shared.com/folder/W3wQffYa/20140421.html
http://www.4shared.com/folder/l2RSwQcv/20140421.html
http://www.4shared.com/folder/KK1eYSi8/20140421.html
http://www.4shared.com/folder/ZQMzd5Da/20140421.html
http://www.4shared.com/folder/hNanHZ6N/20140421.html
http://www.4shared.com/folder/VSowddDG/20140421.html
http://www.4shared.com/folder/xebcPd4P/20140421.html
http://www.4shared.com/folder/8C9dPE4z/20140421.html
http://www.4shared.com/folder/DLIJ7BqU/20140421.html
http://www.4shared.com/folder/IN4xADng/20140421.html
http://www.4shared.com/folder/tfO1w5ef/20140421.html
http://www.4shared.com/folder/iR7epUyt/20140421.html
http://www.4shared.com/folder/9cNJgzab/20140421.html
http://www.4shared.com/folder/A6X0XV0R/20140421.html
http://www.4shared.com/folder/0b8FvE_u/20140421.html
http://www.4shared.com/folder/oKY3-FfV/20140421.html
http://www.4shared.com/folder/aSYf__yV/20140421.html
http://www.4shared.com/folder/x8O1J5ui/20140421.html
http://www.4shared.com/folder/EbzRKvIi/20140421.html
http://www.4shared.com/folder/AhBwegTq/20140421.html
http://www.4shared.com/folder/FwblQtkQ/20140421.html
http://www.4shared.com/folder/tLbS8IIE/20140421.html
http://www.4shared.com/folder/LYnO_Hrp/20140421.html
http://www.4shared.com/folder/QV8LU9al/20140421.html
http://www.4shared.com/folder/bZSMVjrl/20140421.html

Linux路由表的抽象扩展应用于nf_conntrack相关推荐

  1. Linux 路由表解密:详解路由表的构成与作用

    Linux是一种开源的操作系统,自由软件,使用范围非常广泛.Linux中有一个非常重要的功能,就是路由表.路由表是一张表格,用来描述网络中各个主机之间的连接关系.在Linux中,路由表的作用是将数据包 ...

  2. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  3. SSD固态盘应用于Ceph集群的四种典型使用场景

    在虚拟化及云计算技术大规模应用于企业数据中心的科技潮流中,存储性能无疑是企业核心应用是否虚拟化.云化的关键指标之一.传统的做法是升级存储设备,但这没解决根本问题,性能和容量不能兼顾,并且解决不好设备利 ...

  4. Linux主分区,扩展分区,逻辑分区的联系和区别

    基本概念 硬盘分区有三种, 主磁盘分区.扩展 磁盘分区. 逻辑分区. 一个 硬盘 主分区至少有1个,最多4个,扩展分区可以没有,最多1个.且 主分区+扩展分区总共不能超过4个. 逻辑分区可以有若干个. ...

  5. 如何将CSS应用于iframe?

    我有一个简单的页面,其中包含一些iframe部分(以显示RSS链接). 如何将相同的CSS格式从首页应用到iframe中显示的页面? #1楼 上面有一些更改的作品: var cssLink = doc ...

  6. Linux有问必答:如何扩展XFS文件系统

    Linux有问必答:如何扩展XFS文件系统 问题:我的磁盘上有额外的空间,所以我想要扩展其上创建的现存的XFS文件系统,以完全使用额外空间.怎样才是扩展XFS文件系统的正确途径? XFS是一个开源的( ...

  7. 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表

    文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...

  8. linux路由表命令

    转自此大神http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html 留在好查阅 linux 路由表维护 查看 Linux 内核路由表 使用 ...

  9. linux 路由表 的一些相关资料

    =============================================================================== linux 路由表维护 查看 Linux ...

最新文章

  1. WannaCry 不相信眼泪 它需要你的安全防御与响应能力
  2. Java配置环境变量及其意义
  3. C#下的插件体系探讨
  4. socketmq 设置队列大小_C++编程实例:面向对象的整形队列实现
  5. 对C语言main函数中argc和argv[]的理解
  6. springboot整合jpa之连接MySql实现crud
  7. python求扇形面积_Python随机生成均匀分布在单位圆内的点代码示例
  8. RxSwift 系列(一)
  9. Vmware 安装虚拟工具 (二)
  10. 映客上云 助力《疫战到底》系列课程吸引数千万用户观看
  11. 三大缓存框架(Ehcache+Memcache+Redis)基础
  12. 支撑位和压力位怎么看是什么意思?
  13. python输出缓冲区的问题
  14. nginx 一般配置实例 静态页面
  15. 安装QQ、TIM提示:安装包可能被非法改动导致安装失败,请从官网下载最新安装包重新安装
  16. C语言笔试题与答案解析
  17. Qt QAbstractSocket::isValid()
  18. 给自己立一个flag
  19. 《Kotlin 程序设计》第十二章 Kotlin的多线程:协程(Coroutines)
  20. php分割金额_PHP实现红包金额拆分算法案例详解

热门文章

  1. 如何对多个if-else判断进行优化
  2. Vu单元测试-------笔记(一)
  3. 高斯定理下的电场和磁场(详细案例模型分析)
  4. Dplayer实现弹幕功能
  5. 环球时报评出“影响新中国的60位外国人”
  6. 席南华院士:数学的意义
  7. python编程之美pdf_GitHub - Farolding/toPdf: 爬取“Python编程之美:最佳实践指南”制作PDF电子书...
  8. Codeforces-1008A - Romaji - 水题
  9. 斜杆“/”和反斜杠“\”的区别
  10. el vue 手机号_Vue 正则表达式验证邮箱和手机号码