策略说明:

我的基本策略是默认为拒绝,然后对外与开放所需端口,对内部透明,对其他集群的ping透明以便于测试各集群间的连通性。当然,如白名单机器,还需要对其他集群的服务器开放监听端口。

防火墙链与表说明:

我不让TCP包去经历ICMPUDPTCP规则的洗礼,而是简单地匹配所有的TCP包,然后让它去一个自定义链中旅行。这种方法并不比让它经历所有的规则开销大。下图可以解释在Netfilter中,外来的包是如何被处理的

Incoming

INPUT

Local

Process

INPUT

Outcoming

我们完全信任局域网,因此不能阻塞任何从局域网发出的数据传输,但Internet是不被信任的,所以我们想阻塞从Internet向我们的局域网发起的连接。还有一个要优先考虑的事,我们只允许那些被明确说明为可以接受的数据通过。为了做到这一点,我们就要把缺省策略设为DROP。这样,那些没有被明确标识为允许进入的数据就都被阻塞了。下图是此防火墙策略的一次入站数据的过滤次序。

Incoming

INPUT

POLICY:DORP

Icmp_packets

tcp_packets

udp_packets

Localhost

Localnet

ESTABLISHED

RELATED

我们的防火墙只提供了有限的几个服务:FOXYSERVERSQUID等。因此,我们要在INPUT链里允许这些协议通过,还要在 OUTPUT链里允许返回的数据通过。我们除了完全信任局域网,也信任loopback和它的IP地址,因此我们要有相应的规则来允许所有来自局域网和loopback的数据通过。但是我们不会允许一些特殊的包或包头通过,也不会接受Internet上某一段IP的访问。

如果中间件与手机发生了长连接业务,我们则想让包经历最少的规则,所以要把处理establishedrelated状态的规则放到INPUT链的顶部。基于同样的原因,我们把这些规则分到子链中。这样,包就可以尽量少地穿越规则,从而节省时间,也可以降低网络的冗余。

在这个脚本里,我们依据不同的协议(如TCP UDPICMP)把包分到子链中。用来匹配 TCP包的链叫做tcp_packets,它可以匹配所有我们允许通过的FOXYSERVER端口和子协议(如HTTP等)。我们还要建立一个名为allowed的子链,以便在真正接受“那些使用有效端口来访问防火墙的TCP包”之前,对它们进行附加的检查。至于ICMP包,自有称作 icmp_packets的链来处理。在决定如何建立这个链时,我考虑到如果我们同意接受ICMP包的类型和代码,就没有必要对它们做附加的检查,所以直接接受它们就行了。最后,UDP包由谁处理呢?当然就是 udp_packets了。如果包是那种允许被接收的类型,就直接放行了。

OUTPUT

POLICY:DORP

ACCEPT everything from 127.0.0.1

ACCEPT everything from 192.168.x.x

ACCEPT everything from x.x.x.x (wan)

现在,我们来考虑考虑OUTPUT链。因为很信任防火墙,所以我们允许几乎所有离开它的包通过,而没有阻塞任何用户和协议。但我们也不想让人利用这台机子进行IP欺骗,因此我们只放行那些从防火墙本身的IP发出的包。为了实现这一点,我们会在ACCEPT链中加入这样一条规则:如果包是由防火墙的IP发出的,就放行,否则,它们就会被OUTPUT链的缺省策略DROP掉。