根本原因是因为iptables(确切地说是netfilter)是内核态防火墙--这就是它的先天优势--天网这种用户态防火墙于之相比不过是儿童玩具。
当网络接口收到报文的时候通过IRQ通知驱动程序,操作系统内核通过驱动程序把报文从网卡的缓存拷贝到内核态内存,然后就不同了:内核态防火墙就地处理然后决定报文下一步的去向;而用户态防火墙不行,因为用户态代码不能直接访问内核态内存,报文必须还要从内核态内存拷贝到用户态内存中,等用户态进程等到它的时间片之后(最长可能要10毫秒)处理这个报文,决定下一步处理,然后基于同样原因,这个报文还要从用户态内存拷贝到核心态内存,然后才有可能发出。
明白了?用户态防火墙不是效率高地的问题,而是根本谈不上“效率”二字!
用户态防火墙给Windows这种网络效率极差的系统作自我防护用还是可以的,但用在Linux/NetBSD这种网络性能比较强大的系统就太可笑了。
以上是性能方面,还有功能方面就更没法比了:netfilter支持基于状态检测的包过滤、支持完整的SNAT/DNAT、支持TCP/IP报头的篡改......
总之:以后再不要拿Linux的netfilter与什么天网放在一起比较了!