浅谈Linux防火墙:iptables (1)
策略说明:我的基本策略是默认为拒绝,然后对外与开放所需端口,对内部透明,对其他集群的ping透明以便于测试各集群间的连通性.当然,如白名单机器,还需要对其他集群的服务器开放监听端口. 防火墙链与表说明:我不让TCP包去经历ICMP、UDP和TCP规则的洗礼,而是简单地匹配所有的TCP包,然后让它去一个自定义链中旅行.这种方法并不比让它经历所有的规则开销大.下图可以解释在Netfilter中,外来的包是如何被处理的
INPUT Local Process INPUT Outcoming 我们完全信任局域网,因此不能阻塞任何从局域网发出的数据传输,但Internet是不被信任的,我们想阻塞从Internet向我们的局域网发起的连接.还有一个要优先考虑的事,我们只允许那些被明确说明为可以接受的数据通过.为了做到这一点,我们就要把缺省策略设为DROP.这样,那些没有被明确标识为允许进入的数据就都被阻塞了.下图是此防火墙策略的一次入站数据的过滤次序.
Incoming INPUT POLICY:DORP Icmp_packets tcp_packets udp_packets Localhost Localnet ESTABLISHED RELATED
我们的防火墙只提供了有限的几个服务:FOXYSERVER、SQUID等.因此,我们要在INPUT链里允许这些协议通过,还要在 OUTPUT链里允许返回的数据通过.我们除了完全信任局域网,也信任loopback和它的IP地址,因此我们要有相应的规则来允许所有来自局域网和loopback的数据通过.但是我们不会允许一些特殊的包或包头通过,也不会接受Internet上某一段IP的访问. 如果中间件与手机发生了长连接业务,我们则想让包经历最少的规则,要把处理established和related状态的规则放到INPUT链的顶部.基于同样的原因,我们把这些规则分到子链中.这样,包就可以尽量少地穿越规则,从而节省时间,也可以降低网络的冗余.
在这个脚本里,我们依据不同的协议(如TCP、 UDP或ICMP)把包分到子链中.用来匹配 TCP包的链叫做tcp_packets,它可以匹配所有我们允许通过的FOXYSERVER端口和子协议(如HTTP等).我们还要建立一个名为allowed的子链,以便在真正接受“那些使用有效端口来访问防火墙的TCP包”之前,对它们进行附加的检查.至于ICMP包,自有称作 icmp_packets的链来处理.在决定如何建立这个链时,我考虑到如果我们同意接受ICMP包的类型和代码,就没有必要对它们做附加的检查,直接接受它们就行了.,UDP包由谁处理呢?当然就是 udp_packets了.如果包是那种允许被接收的类型,就直接放行了. |
现在,我们来考虑考虑OUTPUT链.很信任防火墙,我们允许几乎所有离开它的包通过,而没有阻塞任何用户和协议.但我们也不想让人利用这台机子进行IP欺骗,因此我们只放行那些从防火墙本身的IP发出的包.为了实现这一点,我们会在ACCEPT链中加入这样一条规则:如果包是由防火墙的IP发出的,就放行,否则,它们就会被OUTPUT链的缺省策略DROP掉.
本文出自 “沧月” 博客,请务必保留此出处http://kc1985.blog.51cto.com/2407758/507943