IP Filter Based Firewalls HOWTO(11)

发表于:2007-06-23来源:作者:点击数: 标签:
IP Filter Based Firewalls HOWTO 9. 有趣的ipf 这一部分不是教你ipf的一些新东西,但是可能提到一些你没有考虑到的,或者引发你发明一些我们没有考虑过的东西。 9.1 内网过滤 很久以前,有个叫Wietse Venema创建了一个tcp-wrapper包,它被用来保护网络服务

   
  IP Filter Based Firewalls HOWTO
    9. 有趣的ipf

这一部分不是教你ipf的一些新东西,但是可能提到一些你没有考虑到的,或者引发你发明一些我们没有考虑过的东西。

9.1 内网过滤

很久以前,有个叫Wietse Venema创建了一个tcp-wrapper包,它被用来保护网络服务,这很好,但是tcp-wrappers也有缺点。首先,就像它名字所说的,它只能保护tcp服务。另外,你必须用.netd来运行服务,而且你还要与libwrap一起编译,并且服务进程跟tcp-wrapper联系起来才能保护你的服务进程。这样系统就留下了一些巨大的安全漏洞,我们可以在本机上使用ipf堵上这些漏洞。例如我的电脑需要经常接入不太可靠的网络,我可以使用以下规则集:
pass in quick on lo0 all
pass out quick on lo0 all

block in log all
block out all

pass in quick proto tcp from any to any port = 113 flags S keep state
pass in quick proto tcp from any to any port = 22 flags S keep state
pass in quick proto tcp from any port = 20 to any port 39999 >< 45000 flags S keep state

pass out quick proto icmp from any to any keep state
pass out quick proto tcp/udp from any to any keep state keep frags


这个规则集对你的本地网来说已经很安全了,如果你想让你的防火墙更安全,你可以使用ftp的应用代理,而且你可以加入防止欺骗的规则集。如果你的机器有很多个用户而且你不想让他们启动一个不属于他们的服务的话,这个规则集是比较合适的。这个规则集不能阻止一个拥有root权限的cracker修改你的ipf规则或者启动一个服务进程,它可以使你在一个复杂的局域网内更安全,我觉得这一点是很重要的。在一个规则集中加入本地过滤的规则通常可以解决很多性能问题。

9.2 什么是防火墙?透明过滤器

建立一个防火墙必须保证防火墙本身的完整性。有人可以突破你的防火墙并改变防火墙规则吗?这是管理员们必须面对的一个问题。
很多网络管理员对普通的以太网桥很熟悉,它是用来将两个独立的以太网连接成一个以太网的设备。通常是用来连接两栋建筑物,转换网络速度或者扩展网络有效的连接距离。集线器和交换器是普通的网桥,有时它们只有两个接口,我们称之为中继器。现在的Linux,OpenBSD,NetBSD,FreeBSD都可以将一台pc机当成网桥使用。网桥有一个共同的特点是连接两台机器,而这两台机器并不知道网桥的存在。
以太网桥作用于ISO协议栈的第二层,ip栈作用于第三层。IP Filter主要是作用于第三层,还涉及到第二层的网络接口。OpenBSD的网桥设备配合IP filter可以建立一个不可见的防火墙。这个系统不需要IP地址,它甚至不用暴露它的以太网地址(MAC)仅仅是使数据包的延迟稍微提高。
建立这样的规则惊人的简单。在OpenBSD里面,第一个网桥设备名是bridbe0.假设我们的机器上有两块网卡,xl0和xl1.为了使这台机器成为一个网桥,我们所要做的仅仅是输入下面三条命令:
brconfig bridge0 add xl0 add xl1 up
ifconfig xl0 up
ifconfig xl1 up

所有到达xl0的数据包都被送到xl1,所有到达xl1的数据包都被送到xl0。你会注意到两个网卡都没有分配IP地址,也没有必要。最好是不分配地址。
尽管有一个bridge0接口,我们并不是基于这个接口进行过滤的,从一个简单的例子开始,假设我们的网络是这样的:
20.20.20.1 <---------------------------------> 20.20.20.0/24 network hub
在20.20.20.1上有一个路由器,所有20.20.20.0/24外出的数据包都是通过20.20.20.1。现在我们加入一个ipf网桥:
20.20.20.1 <-------/xl0 IpfBridge xl1/-------> 20.20.20.0/24 network hub
我们在ipf桥上设置了这样几条规则:
pass in quick all
pass out quick all

这个网络的功能没有改变,现在我们改变一下规则:
block in quick on xl0 proto icmp
pass in quick all
pass out quick all

20.20.20.1和20.20.20.0/24还是认为网络没有改变,只是如果20.20.20.1 ping 20.20.20.2时,它将接受不到回复。事实上20.20.20.2根本就接受不到ping。ipfilter在中间阻止了这个数据包(ping)到达另一端。我们可以在任何地方设置一个ipf网桥。这种方法可以将一个网络缩小到一台主机,只要有足够多的网卡。
阻止来自外网的icmp看起来有点愚蠢,特别的如果你是一个系统管理员,你想ping外网,traceroute,或者改变MTU的大小。让我们建立一个更好的规则集,利用ipf的主要特点:状态检查。
pass in quick on xl1 proto tcp keep state
pass in quick on xl1 proto udp keep state
pass in quick on xl1 proto icmp keep state
block in quick on xl0

这种情况下,20.20.20.0/24(也许称为xl1网络会比较好)能够到达外部网,而外网无法进入20.20.20.0/24,甚至是路由器不安全的时候,防火墙还是能够起作用。
现在我们仅仅是基于接口和协议进行过滤。我们还可以基于ip地址进行过滤。通常我们会提供一些服务,因此我们的规则集看起来会是这样:
pass in quick on xl1 proto tcp keep state
pass in quick on xl1 proto udp keep state
pass in quick on xl1 proto icmp keep state
block in quick on xl1 # nuh-uh, we're only passing tcp/udp/icmp sir.
pass in quick on xl0 proto udp from any to 20.20.20.2/32 port=53 keep state
pass in quick on xl0 proto tcp from any to 20.20.20.2/32 port=53 flags S keep state
pass in quick on xl0 proto tcp from any to 20.20.20.3/32 port=25 flags S keep state
pass in quick on xl0 proto tcp from any to 20.20.20.7/32 port=80 flags S keep state
block in quick on xl0

现在我们有这么一个网络,20.20.20.2是一个域名服务器,20.20.20.3是一个邮件服务器,20.20.20.7是一个web服务器。
我们必须承认,ipfilter网桥还很不完善。
首先,所有的规则都只有in方向而没有out方向。这是因为OpenBSD网桥的out还没有实现。当初这样设计的本意是不因为使用多个接口而使性能大幅降低。现在性能问题已经得到改善,但是out仍然没有实现。如果你有需要,你可以手动修改代码或者是寻求其他OpenBSD使用者的帮忙。
其次,在ipf网桥中使用NAT是很不明智的。因为这将暴露ipf网桥的存在,而且也没有ip地址可以用来映射。当然你可以给接口设置ip地址使得NAT可以正常工作,但是网桥的优点就会降低。

9.2.1 利用透明过滤修复网络设计失误

很多机构认为建立一个子网一个防火墙是一个好主意。他们拥有c类地址甚至更大地址空间的网络,这个网络包含了所有服务,包括他们的服务器,工作站,路由器。这是很糟糕的!重新调整合适的子网,信任级别,过滤器等等将要付出大量的人力和财力。昂贵的付出通常使大部分机构不想去解决这个问题,这还不包括停工期。这个问题看起来是这样的:
20.20.20.1 router 20.20.20.6 unix server
20.20.20.2 unix server 20.20.20.7 nt workstation
20.20.20.3 unix server 20.20.20.8 nt server
20.20.20.4 win98 workstation 20.20.20.9 unix workstation
20.20.20.5 intelligent switch 20.20.20.10 win95 workstation

实际情况可能复杂得多。比较合适的做法是将所有可信任的服务器归为一个子网,其他工作站归为另外一个子网,剩下的就是交换机在同一个子网。现在路由器可以过滤所有子网,限制工作站访问服务器。现在这个C类网络看起来就比较一致了。
首先我们将路由器,工作站,服务器分开。为了达到这个目的,我们需要两个集线器(或者交换机),一台三个网卡的ipf机器.我们将所有的服务器接在一个集线器上,所有的工作站接另一个集线器,通常我们将两个集线器连起来,然后再接到路由器。这里我们将路由器接到ipf的xl0接口,服务器组接到xl1,工作站接到xl2,我们的网络图看起来是这样的:


| 20.20.20.2 unix server
router (20.20.20.1) _____| 20.20.20.3 unix server
| / | 20.20.20.6 unix server
| /xl1 | 20.20.20.7 nt server
-----/xl0 IPF Bridge <
\xl2 | 20.20.20.4 win98 workstation
\______| 20.20.20.8 nt workstation
| 20.20.20.9 unix workstation
| 20.20.20.10 win95 workstation


为了充分的利用filter网桥的优点,我们添加了一些规则:

pass in quick on xl0 proto udp from any to 20.20.20.2/32 port=53 keep state
pass in quick on xl0 proto tcp from any to 20.20.20.2/32 port=53 flags S keep state
pass in quick on xl0 proto tcp from any to 20.20.20.3/32 port=25 flags S keep state
pass in quick on xl0 proto tcp from any to 20.20.20.7/32 port=80 flags S keep state
block in quick on xl0
pass in quick on xl1 proto tcp keep state
pass in quick on xl1 proto udp keep state
pass in quick on xl1 proto icmp keep state
block in quick on xl1 # nuh-uh, we're only passing tcp/udp/icmp sir.
pass in quick on xl2 proto tcp keep state
pass in quick on xl2 proto udp keep state
pass in quick on xl2 proto icmp keep state
block in quick on xl2 # nuh-uh, we're only passing tcp/udp/icmp sir.


这样来自路由器目的地址是服务器的数据包将受到限制,而服务器跟工作站可以自由通信。如果你不想让你的工作站访问服务器可以作些改动:
pass in quick on xl2 proto tcp keep state
pass in quick on xl2 proto udp keep state
pass in quick on xl2 proto icmp keep state
block in quick on xl2 # nuh-uh, we're only passing tcp/udp/icmp sir.

改为:
block in quick on xl2 from any to 20.20.20.0/24
pass in quick on xl2 proto tcp keep state
pass in quick on xl2 proto udp keep state
pass in quick on xl2 proto icmp keep state
block in quick on xl2 # nuh-uh, we're only passing tcp/udp/icmp sir.

或许你想使工作站只可以通过IMAP收发邮件。这也很简单:
pass in quick on xl2 proto tcp from any to 20.20.20.3/32 port=25
pass in quick on xl2 proto tcp from any to 20.20.20.3/32 port=143
block in quick on xl2 from any to 20.20.20.0/24
pass in quick on xl2 proto tcp keep state
pass in quick on xl2 proto udp keep state
pass in quick on xl2 proto icmp keep state
block in quick on xl2 # nuh-uh, we're only passing tcp/udp/icmp sir.

原文转自:http://www.ltesting.net