今天下午帮学校做项目,正好要用到iptables,而且不是常规的iptables用法,(raw socket配合iptables做nat等等)。由于进展一直不顺利(虽然今天下午还是搞定了),最后才发现其实是linux的防火墙机制的漏洞造成的。
前提知识:
Linux防火墙机制(netfilter的4张表和5条链)
Socket编程基础知识
linux的内核级防火墙模块----netfilter,是自2.6内核引入的强大的防火墙系统,除了常规的静态防火墙,还有支持基于上下文的包分析等等功能。能够同时针对2,3层进行过滤。同是还整合了NAT等功能。很多基于linux的软路由就是用netfilter来实现几乎所有的防火墙功能。
虽然netfilter很好很强大,但是linux并不像思科的ios那样是专门针对网络的,linux本身极高的灵活性在某种程度上说正是造成了netfilter漏洞的主要原因。(只要有个bash,有个编译器,有个编辑器,你就能编译任何你想要的东西了)
netfilter大体的思想是在linux的tcp/ip协议栈特定位置处放置钩子函数,然后抓到对应的数据包然后做出对应的处理。
这种看似很好的做法,遇到了开源的linux,实际上就失去很大一部分的安全性。
入站方向上最大的弱点就是屏蔽不干净。
如果有程序编写的时候使用ncap或者raw socket之类的底层函数,而不使用高层的socket封装,那么在input/forward方向上的过滤则完全无效。使用底层函数的程序依然可以获取到它们想要的数据流(连同一堆不必要的流量一起获取)
出栈方向上就会出现同样问题。尤其是本地发起的数据,很多情况下是使用raw socket,不经过linux内核的协议栈,此时这些数据根本不会经过iptables的FORWARD/POSTROUTING/OUTPUT链,甚至不会被算进内核的包计数中。使用raw socket的程序,在经过内核的NAT的时候会完全被内核忽略,从而没有经过NAT过程。
对于转发的数据,除非出入站方向上有底层函数专门截取,否则所有数据都是经过内核处理,此时几乎没有安全性问题。
利用raw socket,程序就可以在完全绕过netfilter的过滤下正大光明的收发数据。
幸运的是,raw socket的使用需要root权限,否则raw socket会创建失败。(体现了root权限的重要性)
类似的,也能绕过tcp_wrap(本来tcp_wrap安全性就更差,不链接libwrap的库就完全没用)等机制。
bo8362 于 2010-10-10 13:47:38发表:
也是路过地
mft809849218 于 2010-10-09 22:43:20发表:
太专业了,只能路过!!
紫色葡萄 于 2010-10-07 19:44:57发表:
Iptables 防火墙 设计上就是工作在网络层的包过滤防火墙,
若要底层过滤,对不起,鞭长莫及,因为超出了设计范围。
再说,防火墙也不是报治百病的。