上面我们已经创建了一个规则集,使ipfw能够允许对发出的互联网请求进行响应,并能进行DNS名字解析。下面我们将仔细调节已经创建的规则集的性能,并通过内置的登录工具对它进行测试。
创建的规则集已经可以起作用了,因此可以在DHCP规定的时间用完之前使用互联网连接了。时间用完后,互联网连接就不能再使用了。要搞清楚是哪条规则实现互联网连接的,对DHCP的基本工作原理有一定的了解是很有必要的。
DHCP使用UDP数据包,意味着动态规则和状态表在这里是不起作用的。因此必须允许在我的计算机和ISP的DHCP服务器之间传输UDP数据包。DHCP需要二个端口:DHCP客户端使用端口68,ISP的DHCP服务器使用端口67。
为了搞明白DHCP的工作原理,我们来看一下我的计算机的DHCP“租用”文件:
more /var/db/dhclient.leases
lease {
interface "ed0";
fixed-address 24.141.119.162;
option subnet-mask 255.255.252.0;
option time-offset -18000;
option routers 24.141.116.1;
option domain-name-servers 24.226.1.90,24.226.1.20,24.2.9.34;
option host-name "my_hostname";
option domain-name "my_domainname";
option broadcast-address 255.255.255.255;
option dhcp-lease-time 604800;
option dhcp-message-type 5;
option dhcp-server-identifier 24.226.1.41;
renew 2 2001/5/15 13:12:11;
rebind 5 2001/5/18 04:12:11;
eXPire 6 2001/5/19 01:12:11;
}
DHCP服务器提供了一个IP地址、子网掩码、缺省的网关地址、三个DNS服务器的IP地址、我的主机名和提供服务的DHCP服务器的IP地址。由于DHCP“租用”契约是一种真正的“契约”,这意味着我必须保存好这些信息,最后三行内容与我的DHCP客户端如何重新修改“租用”契约有关。
以renew开头的这一行向我的DHCP客户端表明它何时应该结束,并更新其“租用”契约,这一时间要早于expire行中列出的时间。在2001年5月15日13时12分11秒,我的计算机将会向IP地址为24.226.1.41的DHCP服务器上的端口67发送UDP数据包,因此需要添加一条规则允许向外发送UDP数据包。如果DHCP服务器收到了我的计算机发送的UDP数据包,它应该对要求更新“租用”契约的要求作出响应,并且以UDP数据包形式将此信息发回到我的计算机上的68端口。因此,我另外还需要在规则集中添加一规则,允许ipfw对此信息作出反应。
如果不在规则集中添加这些规则,或者由于其他原因DCHP服务器没有对我的计算机发出的更新“租用”契约的要求作出响应,rebind行将在2001年5月18日4时12分11秒启动,这时,我的DCHP客户端就会开始担心“租用”期满,将会向DHCP服务器发出更多的UDP数据包,只是这次将不再向特定的DHCP服务器发送数据包,而是会向255.255.255.255发送数据包,任何服务器都可以响应发出的请求。
如果没有DHCP服务器进行响应,我的计算机的契约会在2001年5月19日1时12分11秒结束,这意味着我的DCHP客户端不能保证还可以继续使用这些租用信息。这时,会有几种情况出现。客户端将继续试图与DHCP服务器联系,向端口67发送UDP数据包。它将继续试图用ping与缺省的网关联系,检查其IP地址是否仍然有效。在最坏的情况下,我的客户端的IP地址已经无效,DHCP服务器的应答将作为广播被IP地址为255.255.255.255的机器的68端口接收。
既然已经明白了其工作原理,我们就清楚应该在规则集中添加什么样的规则了。在添加规则前,应该对规则进行仔细的检查,因为规则的顺序已经越来越重要了。规则集中的规则越多,前面的规则覆盖后面新添加的规则的可能性也就越大。设计一个好的规则集的诀窍是让你希望的数据包使用尽可能少的规则,如果添加的规则过多,尽管防火墙仍然会起作用,但这样会加重ipfw不必要的负担,因为在找出一个数据包适应的规则前它需要读取更多的规则。此外,在你希望搞清楚到底是哪一条规则使系统不能按你的意愿运行时,规则太多了会相当的麻烦。
我将以超级用户的身份运行ipfw show命令检查当前的规则:
su
PassWord:
ipfw show
00100 0 0 allow ip from any to any via lo0
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 check-state
[1] [2] [3] 下一页
00301 0 0 deny tcp from any to any in established
00302 0 0 allow tcp from any to any keep-state setup
00400 0 0 allow udp from 24.226.1.90 53 to any in recv ed0
00401 0 0 allow udp from 24.226.1.20 53 to any in recv ed0
00402 0 0 allow udp from 24.2.9.34 53 to any in recv ed0
00403 0 0 allow udp from any to any out
65535 0 0 deny ip from any to any
由于我需要向外发送UDP数据包,因此需要指明DHCP端口号和DHCP服务器的IP地址,作为超级用户,我将考虑在/etc/ipfw.rules文件中添加下面的内容:
#allow DHCP
add 00500 allow udp from any 68 to 24.226.1.41 67 out via ed0
add 00501 allow udp from 24.226.1.41 67 to any 68 in via ed0
这些规则可以说是使DHCP客户端更新其“租用”契约所需要的最少的规则了,是否需要添加更多的规则会因DHCP服务器可靠性的不同而有所不同。如果DHCP服务器总是能够响应我的更新请求,我也就无需采用发送UDP广播、ping缺省的网关或者接收UDP广播这些方式了。如果DHCP服务器的可靠性不高,那就还需要添加下面的规则:
add 00502 allow udp from any 68 to 255.255.255.255 67 out via ed0
add 00503 allow udp from any 67 to 255.255.255.255 68 in via ed0
由于我使用的DHCP服务器是相当可靠的,因此不需要立即添加00502和00503这二条规则。我只是反复提醒自己,在ISP的DHCP服务器出了问题或其IP地址有变化的时候就需要考虑这二条规则了。
在保存修改之前,我将把00500和00501二条规则与其余的规则进行比较,以确保它们之间没有任何冲突和重复之处,结果00403和00500之间确实存在着部分重复:
add 00403 allow udp from any to any out
add 00500 allow udp from any 68 to 24.226.1.41 67 out via ed0
因为规则00403允许我的计算机发出任何的UDP数据包,ipfw就不会读取其他的只从端口68发送UDP数据包的规则,在这里,就需要在使用数量最少的规则还是使用把各种可能都考虑在内的数量最多的规则之间进行选择了。
规则00403是在创建允许DNS解析时添加的,如果删除了它,就需要添加三条规则才能实现向三个DNS服务器发送UDP数据包的功能。另外,如果还需要向其他的服务器发送UDP数据包,我就必须再添加规则。因此,如果不使用这样一条“通用”的规则,ipfw规则集中就会包含一些多余的规则,使系统负担不必要的负荷。
这样作也不符合使用最少数量规则的原则,但我们必须仔细审查一下“通用”规则带来的潜在后果。如果我限制系统接受UDP数据包,向外发送UDP数据包是不会有什么危险的。例如,规则00403允许我的计算机向外发送任何数据包,但规则00400、00401、0402和00501保证我的计算机只能接受我的ISP的3台DNS和一台DHCP服务器发送的UDP数据包。因此,对于我的单独运行的FreeBSD计算机而言,这个规则集还是比较合理的。
如果我在FreeBSD防火墙后面添加新的客户端机器,就需要重新考虑这个规则集。例如,微软的客户端会发送数量不等的UDP数据包通报其共享资源,让这些数据包通过防火墙发送出去,对我而言是不负责任并具有一定安全风险的。在本例中,我将使用只能发出我需要发出的UDP数据包的规则,而删除可以发出任意UDP数据包的规则。
由于我现在保护的只是一台单独的FreeBSD计算机,因此我将保留规则00403,删除规则00500,因为系统永远都不会读取到它。我将对规则进行如下的改变:
#允许DHCP 操作
add 00501 allow udp from 24.226.1.41 67 to any 68 in via ed0
保存所作的改变,并通过使用killall init命令进行测试,以超级用户身份重新登录,看看所作改变的效果。
su
Password:
ipfw show
00100 0 0 allow ip from any to any via lo0
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 check-state
00301 0 0 deny tcp from any to any in established
00302 0 0 allow tcp from any to any keep-state setup
00400 8 1322 allow udp from 24.226.1.90 53 to any in recv ed0
00401 0 0 allow udp from 24.226.1.20 53 to any in recv ed0
00402 0 0 allow udp from 24.2.9.34 53 to any in recv ed0
上一页 [1] [2] [3] 下一页
00403 8 469 allow udp from any to any out
00501 4 1592 allow udp from 24.226.1.41 67 to any 68 in recv ed0
65535 29 8591 deny ip from any to any
我好象从IP地址为24.226.1.90的DNS服务器收到了8个UDP数据包,从IP地址为24.226.1.41的DHCP服务器收到了4个UDP数据包。现在,我们再来看看DHCP的“租用”时间问题。
more /var/db/dhclient.leases
renew 3 2001/5/16 07:46:25;
rebind 5 2001/5/18 08:50:46;
expire 6 2001/5/19 01:12:14;
(出处:http://www.sheup.com)
(出处:http://www.sheup.com/)