9. 有趣的ipf
这一部分不是教你ipf的一些新东西,但是可能提到一些你没有考虑到的,或者引发你发明一些我们没有考虑过的东西。
9.1 内网过滤
很久以前,有个叫Wietse Venema创建了一个tcp-wrapper包,它被用来保护网络服务,这很好,但是tcp-wrappers也有缺点。首先,就像它名字所说的,它只能保护tcp服务。另外,你必须用inetd来运行服务,而且你还要与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 p


当前位置: