netfilter。sourceforge,github上有一个凄凉的项目,那就是nf-hipac。这个以前给Linux firewall设计带来希望的项目早在2005年就停止了更新和维护,而我本人则是在2007年才被曹老师带上道的...知道hipac则是2012年的事,以前在2.6.13上编译成功,获得了声称的所谓高性能。后来我的工作大部分都在2.6.32上进行,因为2.6.32引入大量2.6.13上没有的机制,也因为版本号间隔太多,内核API不兼容。hipac移植到2.6.32上费了不少劲。消耗了好几个本来应该干点别的的夜晚。
       其实。以前。我对hipac是非常认可。理由之中的一个就是我发现它是“用规则来匹配数据包”的,而不是像iptables那样“用数据包来匹配规则”的。毫无疑问,Cisco和华为等厂商的硬件设备差点儿都是使用这样的方式来匹配ACL的。当我发现Linux上的hipac能够使用软件来实现相似机制时,当然会兴奋一阵子的。另外一个理由则是。我一直都比較认可多个match的并行匹配,这样能够非常好的利用多个CPU核心,如今我觉得我的这第二个理由全然是胡扯!cache missing,DCA,DMA且不多说,光是调度开销就已经抵销掉了并行匹配的优势。假设没有专门的硬件来进行matching offload,就不要在软件层面用CPU去做这样的转瞬即逝的事情,换句话说,那就是match匹配的粒度太小了,大炮不是用来打蚊子的。CPU是流水化作业的。没有规划好流水线的运行流是不适合CPU来运行的。

喜欢hipac就仅仅剩下了第一个理由!

当我试用了ipset之后,发现hipac真的是个鸡肋项目。并且全然违背了UNIX的原则。怎么说呢?要知道假设我须要禁掉10000个IP地址,用iptables的-s。-d的话,就须要10000条规则,来了一个数据包就须要顺序匹配这10000条规则。注意,是一个一个比对。能不能反过来。让这10000个IP自己发现它们是否包括这个数据包的IP地址呢?这就须要将这10000个IP地址作为一个总体来对待。hipac项目实现的要旨就是这样,内部会将这10000个IP地址组织成一个便于高效查找的数据结构,而不是像iptables那样逐条匹配。然而ipset更适合做这件事,并且更符合UNIX的原则。
       假设我们用诸如hipac的方案。我会这样加入10000个IP地址规则(我使用了iptables的语法):
hipac -s ip1 -j DROP
...
hipac -s ip10000 -j DROP

写法上和iptables一样,仅仅是内部将这些IP地址组织成了树或者hash表,假设既要匹配源又要匹配目标的话,每条规则仅仅须要略微复杂一点:
hipac -s ip1 or -d ip1 -j DROP
...
hipac -s ip10000 or -d ip10000 -j DROP

显然,一条规则包括了两个匹配,完毕了两件事。假设我用ipset的话。则是全然分开了全部的事情:
ipset create srcset hash:ip
ipset create dstset hash:ip
ipset add srcset ip1
...
ipset add srcset ip10000
ipset add dstset ip1
...
ipset add dstset ip10000
iptables -A FORWARD -m set --match-set srcset src -j DROP
iptables -A FORWARD -m set --match-set dstset dst -j DROP

依旧用的是iptables,最后我贴出性能測试的结果后就会发现,iptables本身并非性能瓶颈。假设说10000条规则确实减少了性能。那么错误在于你加入了10000条规则。全然能够将iptables作为一个机制而不是策略,你须要优化的是match而不是iptables框架本身。

       下面是我的性能測试结果,注意这是一个相对值而不是绝对值。因为我是在虚拟机上跑的。因此我就不贴硬件配置了。另外,我用的是UDP。这样仅仅能从丢包上看性能了。摆脱了TCP的流量控制算法的不同而带来的结果不同。

1.裸跑,没有iptables,没有ipset

2.使用ipset,加入超级多的IP地址

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9nMjUw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9nMjUw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

3.使用iptables,加入10000条左右iptables

这个结果足以让nf-hipac下课了。

另外我觉得。nf-hipac下课也有它自己的原因。它从来没有做到内核模块化和用户程序即编译即使用,为内核打patch。又一次编译等就会吓退非常多有心者。
       近期关于iptables的工作并不在其本身的性能优化。而是代码感观上的优化,比方nftables项目等。

ipset高大上性能果断将nf-HiPac逼下课的更多相关文章

  1. SqlServer性能检测和优化工具使用详细

    工具概要 如果你的数据库应用系统中,存在有大量表,视图,索引,触发器,函数,存储过程,sql语句等等,又性能低下,而苦逼的你又要对其优化,那么你该怎么办?哥教你,首先你要知道问题出在哪里?如果想知道问 ...

  2. SqlServer性能检测和优化工具使用详细(转)

    转载链接:http://www.cnblogs.com/knowledgesea/p/3683505.html 工具概要 如果你的数据库应用系统中,存在有大量表,视图,索引,触发器,函数,存储过程,s ...

  3. SqlService性能检测和优化工具

    工具概要 如果你的数据库应用系统中,存在有大量表,视图,索引,触发器,函数,存储过程,sql语句等等,又性能低下,而苦逼的你又要对其优化,那么你该怎么办?哥教你,首先你要知道问题出在哪里?如果想知道问 ...

  4. ThinkPHP 3.2 性能优化,实现高性能API开发

    需求分析 目前的业务全站使用ThinkPHP 3.2.3,前台.后台.Cli.Api等.目前的业务API访问量数千万,后端7台PHP 5.6,平均CPU使用率20%. 测试数据 真实业务 php5.6 ...

  5. Rest API

    一.前言 在软件行业快速发展的今天,传统的软件授权已经不能足以满足一个IT类的公司的发展.虽然在大部分公司里,它还是现金池的直接源头.但是在可遇见的未来,受摩尔根理论的失效.物联网的发展等影响,应用的 ...

  6. REST API 安全设计

    REST API 安全设计 2017年04月27日 18:34:27 阅读数:1699   Rest API 的那些事儿 作者/ asterisk 在软件行业快速发展的今天,传统的软件授权已经不能足以 ...

  7. 学习CSS3动画(animation)

    CSS3就是出了不少高大上的功能,3D效果.动画.多列等等.今天写篇文章记录怎么一下怎么用CSS3写一个动画. 丑话还得说前头,IE9以及以下版本不支持CSS3动画(如真要实现可以考虑用js,不过估计 ...

  8. Neutron 理解 (8): Neutron 是如何实现虚机防火墙的 [How Neutron Implements Security Group]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  9. 构建服务端的AMD/CMD模块加载器

    本文原文地址:http://trock.lofter.com/post/117023_1208040 . 引言:  在前端开发领域,相信大家对AMD/CMD规范一定不会陌生,尤其对requireJS. ...

随机推荐

  1. finger用户名、主目录、停滞时间、登录时间

    finger yum install finger    1.作用    finger用来查询一台主机上的登录账号的信息,通常会显示用户名.主目录.停滞时间.登录时间.登录Shell等信息,使用权限为 ...

  2. cocos2dx-lua牧场小游戏(一)

    环境: cocos2dx-3.0rc2,   xcode5.0 一.lua项目建立參考 http://blog.csdn.net/daydayup_chf/article/details/249641 ...

  3. MySQL数据转移至MSSQL详解

    一.安装MySQL ODBC驱动 为MySQL安装Connector/ODBC驱动.在此需要注意的一点是Connector/ODBC驱动与MySQL Server的版本对应问题.   二.创建系统DS ...

  4. Bootstrap网站模板

    根据一篇文章,我再想想写下,无意义,他决定收手. 或者直接做一个简单的基本的模板它 主要知识点包含栅格系统.响应式图片.导航条(固定在顶部和底部).搜索框等等 详细每一个知识点不再赘述,參考Boots ...

  5. HTTP请求响应过程 与HTTPS区别

    原文:HTTP请求响应过程 与HTTPS区别 HTTP协议学习笔记,基础,干货 HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏 ...

  6. 讨论JDK的File.equal()

    我们一般比较两个文件中的对象是相同的文件,通常使用java.io.File.equal().这里,equal()是不是文件内容的比较结果为.象是否指向同一个文件. File的equal()方法.实际上 ...

  7. cocos2d-x坐标系

    在cocos2d-x在,有几种不同的坐标系. 因为有好几个坐标系着一定的差异,他们需要明白,能力更精确的绘制各种图形画面上. 1.屏幕坐标系 只windows通过绘制图形上基本都知道.相应的坐标系统: ...

  8. WPF对于xml的简单操作(下)绑定ListView

    上个月做好的,电脑给盗了,没及时存在网盘,也及时发到随笔,于是乎悲哉!搞了一个上午终于绑定好了,有时候就是这么眼瞎,Path和XPath全瞎了,摸滚了一个上午,赶紧的随笔跟上先. <ListVi ...

  9. vim ---- 自己主动的按钮indent该命令

    当使用vim一段代码的副本到一个程序时,有,经常indent会有一些问题. . 下面的这个强大的命令,使您可以一键码具有很好的格式. gg=G 样品:         

  10. delphi webbrowser 经常使用的演示样本

    var Form : IHTMLFormElement ; D:IHTMLDocument2 ; begin with WebBrowser1 do begin D := Document as IH ...