很多初次接触 ISA 的管理员,经常会发现自己的管理意图没有得到贯彻。自己明明禁止用户使用 QQ 聊天,可你看这个老兄正在和多个 MM 聊得热火朝天 ; 早就禁止在上班时间访问游戏网站,可这个家伙不正在和别人下棋吗 ? 最郁闷的是就连简单的禁止访问百度搜索引擎都做不到,照样有很多人用百度搜来搜去 …… 不少深感智力受到侮辱的网管愤怒地发出了 “ISA 就是不灵 的吼声。 ISA 真是不灵吗 ? 不是的,其实发生这些的主要原因是 ISA 管理员并没有真正理解防火墙策略的执行过程。今天我们就来好好地分析一下 ISA 防火墙策略的执行过程,避免在以后的工作中犯类似的错误。
  首先声明,我们今天讨论的是 ISA2006 标准版的策略执行过程,企业版比标准版要复杂一些,以后我们再讨论。我们可以把 ISA 当作是信息高速公路上的一个检查站,当有数据包要通过 ISA 时, ISA 就会利用策略对数据包进行检查,检查通过就放行,否则就拒绝。 ISA 检查数据包的顺序是:
  一 检查是否符合网络规则
  二 检查是否符合系统策略
  三 检查是否符合防火墙策略
  一 网络规则
  一个数据包通过 ISA 时, ISA 首先要检查的就是网络规则。网络规则是 ISA 中非常重要而又很容易被忽视的一个因素。 ISA 检查数据包时首先要考虑的就是这个数据包是从哪个网络到哪个网络,这两个网络间的网络规则是什么。也就是说 ISA 是基于网络进行控制,而不是很多朋友认为的基于主机进行控制。网络规则只有两种,路由或 NAT 。如果 A 网络到 B 网络的网络规则为路由,那么数据包从 A 网络到 B 网络或者从 B 网络到 A 网络都有可能 ; 如果 A 网络到 B 网络的网络规则为 NAT ,那么数据包只有可能从 A B ,而不可能从 B A 。我们可以把两个网络比喻为两个城市,网络规则就象是城市之间的高速公路,如果两个网络之间的网络规则为路由,那就象是两个城市之间有一条双向高速公路 ; 如果网络规则为 NAT ,则就相当于两个城市之间有一条单行高速公路。
  明白了网络规则的作用,有些问题就很好解释了。有些 ISA 管理员问过这样一个问题: 我在 ISA 的防火墙策略中已经允许外网访问内网,为什么外网机器还是访问不进来 ?” 现在来看这个问题就很简单了,因为 ISA 认为内网和外网之间的网络规则是 NAT ,如下图所示, NAT 规则决定了只有可能从内网到外网而不可能从外网到内网,因此当外网访问内网时, ISA 只需检查网络规则就。因此如果你确实需要外网访问内网,你就应该先把内网和外网之间的网络规则改为路由。
   <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
  还有一个网络规则的例子,有一个管理员用 ISA DMZ 区的一个 FTP 服务器发布到了外网和内网,结果外网用户访问正常,内网用户却无法访问。为什么,因为 DMZ 和外网是 NAT 关系,而 DMZ 和内网是路由关系。由于从 DMZ 到外网是 NAT 关系,外网用户无法通过访问规则直接访问,所以通过发布规则访问是合理的 ; 而内网和 NAT 是路由关系,因此内网用户就应该通过访问规则而不是路由规则来访问。
  综上所述,网络规则是 ISA 进行访问控制时所要考虑的第一要务,只有从源网络到目标网络被网络规则许可了, ISA 才会继续检查系统策略和防火墙策略 ; 如果访问规则不许可, ISA 会直接拒绝访问,根本不会再向下检查系统策略和防火墙策略。大家写访问规则时一定要注意这点。

   
系统策略
  如果一个数据包通过了网络规则的检查, ISA 接下来就要看看它是否符合系统策略了。 ISA2006 标准版中预设了 30 条系统策略,系统策略应用于 ISA 本地主机,控制着从其他网络到本地主机或者从本地主机到其他网络的通讯,系统策略中启用了一些诸如远程管理,日志,网络诊断等功能。一般情况下,我们对系统策略只能允许或禁止,或对少数策略的某些属性作一些修改。
  以前曾经有朋友问我,为什么 ISA 安装后防火墙策略中明明禁止了所有通讯,但 ISA 主机还是可以 ping 到其他计算机,是否 ISA 本机有某些特权呢 ? 不是的, ISA 能对其他网络进行有限访问完全是由系统策略决定的,只是由于系统策略没有显示出来,因此安装完 ISA 后我们并没有注意到它。
  我们来看看系统策略到底有哪些内容,打开 ISA 服务器管理,右键点击防火墙策略,如下图所示,在查看中选择 显示系统策略规则
  
  如下图所示,我们看到了 30 条系统策略的内容。
  
  编辑系统策略也可以用系统策略编辑器,系统策略编辑器为管理员提供了更为友好的管理界面,如下图所示,右键点击 防火墙策略 ,选择 编辑系统策略
  
  如下图所示,我们可以在系统策略编辑器中编辑系统策略。
  
  系统策略的优先级比防火墙策略高,因此如果任务可以用系统策略完成,就不要用防火墙策略。例如有时候我们为了测试需要,允许从内网 ping ISA 服务器,这种需求完全可以用系统策略完成,如下图所示,我们只要把内部网络添加到允许 ping 本地主机的集合中,就可以完成任务了。
  

  三 防火墙策略
  防火墙策略用来控制源网络和目标网络的通讯,是 ISA 管理员控制网络访问的常规武器,也是本文讨论的重点所在。防火墙策略的优先级就是按照规则排列的顺序,而不是按照拒绝优先原则。由于系统策略优先级也是按照序号排列,和防火墙策略优先级完全一样,我们甚至可以把防火墙策略看成是从 31 开始编号的系统策略。
  数据包通过网络规则的检查后,就要面临系统策略和防火墙策略的考验了。 ISA 将从第一条策略开始检查,检查数据包的访问请求是否匹配策略,如果匹配,就按照策略的规定执行,结果无非是禁止或允许。如果不匹配, ISA 就将按顺序检查下一条策略,从第一条系统策略一直检查到最后一条防火墙策略。那有人要问了,如果把所有策略都检查完了还不匹配怎么办 ? 呵呵,这是不可能的, ISA 自带的最后一条防火墙策略内容是禁止所有网络间的一切通讯,如下图所示,这条防火墙策略可以与所有的网络访问相匹配,因此 ISA 实际上使用了隐式拒绝,也就是说如果某个访问请求如果没有被策略显式允许,那肯定会被最后一条防火墙策略所拒绝。
  
  看了上面的介绍,我们要注意两点,一是策略顺序,二是策略匹配。
   A 策略顺序
  防火墙策略的排列顺序决定了优先级,排在前面的策略优先执行,根据这个原则,我们要好好设计一下防火墙策略的顺序。例如,我们写了两条防火墙策略,一条是允许内网用户任意访问,另外一条是拒绝内网用户访问联众游戏网站。如果排列顺序如下图所示,允许策略排在拒绝策略之前,那就是个错误的决定。拒绝访问联众的策略永远不会被执行,因为当用户访问联众时,访问请求匹配第一条防火墙策略,用户就被防火墙放行了,第二条策略根本没有执行的机会。正确的做法是将拒绝策略放到允许策略之前 !
  
   B 策略匹配
  策略匹配是 ISA 管理员关注的核心问题。前面我们一直在提如果网络访问和防火墙策略匹配,则按防火墙策略执行允许或禁止的操作。那么,问题是,怎么才算和防火墙策略匹配呢 ?
  只有把这个问题搞清楚了,才能写出符合你设计初衷的策略。
  当 ISA 检测到访问请求时, ISA 会检查访问请求能否匹配防火墙策略中的策略元素,策略元素的检查顺序为 协议,从 ( 源网络 ) ,计划时间,到 ( 目标网络 ) ,用户,内容类型。如果和这些元素都能匹配, ISA 就认为访问请求匹配防火墙策略。
  从被检查的策略元素来看, ( 目标网络 ) 元素最容易出问题。
  目标网络元素的问题容易出在哪儿呢 ? 容易出现在 DNS 上,确切地说是出现在 DNS 的反向解析上 ! 这个结论估计是很多管理员始料未及的,还是举个例子加以说明吧,假设我们要禁止内网访问百度,我见过很多管理员的处理方法都是这样的,首先创建一个域名集,将 [url]www.baidu.com[/url] 包含进去,如下图所示。
  

  然后就写出一条拒绝内网访问百度的访问规则,如下图所示
  
  我们在一台内网计算机 Denver 上测试一下, Denver 使用 Web 代理访问百度,如下图所示,错误信息表明 ISA 拒绝了 Denver 访问百度的请求。这说明访问请求和拒绝百度访问的防火墙策略匹配成功,哈哈,看样子大功告成了 ? 且慢,再向下看。
  
  我们在 Denver 上换用 IP 访问,在 IE 中输入 202.108.22.5 ,如下图所示,熟悉的百度界面已经出来了,哈哈,貌似严谨的访问规则竟如此不堪一击 ! 这说明这次的访问请求没有和拒绝百度访问的防火墙策略匹配成功,而是和第二条允许内网用户任意访问的防火墙策略匹配成功了。
  
 看到这儿,有些朋友可能得出结论了,哦,原来用域名禁止访问某个网站是不成立的。错 ! 如果 202.108.22.5 的反向解析结果为 [url]www.baidu.com[/url] ,那么拒绝百度的防火墙策略就是成立的 !

 还是来认真分析一下原理吧,当客户机用 HTTP 协议访问目标网络时, ISA 判断目标网络的根据是 HTTP 主机头,主机头的内容显然源自我们在浏览器中的输入。当我们在浏览器中输入 [url]www.baidu.com[/url] 时, ISA 开始检查访问请求能否匹配第一条防火墙策略,也就是拒绝内网访问百度的那条策略。 ISA 先检查协议,从 ( 源网络 ) ,计划时间三个元素,这三个元素都能和访问请求匹配,然后 ISA 检查到 ( 目标网络 ) 元素, ISA 根据主机头内容判断访问请求中的目标网络是 [url]www.baidu.com[/url] ,而防火墙策略中的目标网络元素也包含了 [url]www.baidu.com[/url] ,因此 ISA 判断访问请求和到 ( 目标网络 ) 元素也能匹配上。然后 ISA 检查用户和内容类型两个元素也可以匹配,所以 ISA 判断访问请求和拒绝访问百度的防火墙策略完全匹配,于是按照防火墙策略的要求拒绝了这次访问请求。
  当我们在浏览器中输入 202.108.22.5 时, ISA 是这么检查的。首先还是判断 协议,从 ( 源网络 ) ,计划时间三个元素匹配策略,然后检查到 ( 目标网络 ) 元素, ISA 判断访问请求的目标是 202.108.22.5 ,而防火墙策略的目标网络是包含 [url]www.baidu.com[/url] 的域名集,这时 ISA 会对 202.108.22.5 进行 DNS 反向解析,如果解析的结果等于 [url]www.baidu.com[/url] 。, ISA 就认为访问请求的目标网络和策略的目标网络也是匹配的。如果反向解析的结果不等于 [url]www.baidu.com[/url]( 解析的结果确实不是百度的域名 ) ISA 就认为访问请求的目标网络和防火墙策略的目标网络不匹配。这样 ISA 就会停止匹配第一条拒绝访问百度的防火墙策略,转而匹配第二条允许内网任意访问的防火墙策略,匹配结果是完全成功,因此 ISA 执行第二条防火墙策略规定的动作,允许了对 202.108.22.5 的访问。
  如果客户机不是用 HTTP 协议访问目标网络,那么匹配的过程又稍微有些不同。例如客户机用 FTP 协议访问 [url]www.baidu.com[/url] ,那么客户机在发送访问请求时不会把 [url]www.baidu.com[/url] 作为目标网络,而是先对 [url]www.baidu.com[/url] 进行域名解析,然后把解析出来的 IP 作为目标网络发送给 ISA ISA 对访问请求进行匹配时,如果被匹配的防火墙策略用域名描述目标网络, ISA 就会对访问请求发来的 IP 进行反向解析,看解析出的域名能否和防火墙策略的目标网络相匹配。根据这个结论,我们用 IE 访问 [url]www.baidu.com[/url] 会被拒绝,因为刚才分析过了,此时客户机将域名 [url]www.baidu.com[/url] 作为访问请求中的目标网络发送给 ISA ISA 认为访问请求和拒绝访问百度的防火墙策略完全匹配,因此客户机被拒绝访问。但如果客户机在命令行下输入 telnet [url]www.baidu.com[/url] 80 ,如下图所示,直接连接百度的 80 端口, ISA 会如何处理呢 ?
  

  如下图所示, ISA 对访问请求放行了,显然这次的访问请求没有和拒绝访问百度的策略匹配上,原因是什么呢 ?
  

  客户机 telnet 百度 80 端口时,我在 ISA 上启用了实时日志,日志记录的结果如下图所示。从日志上我们很清楚地看到,客户机先对 [url]www.baidu.com[/url] 进行了 DNS 解析,解析结果为 202.108.22.5 ,然后客户机把 202.108.22.5 作为访问请求的目标网络发送给 ISA ISA 202.108.22.5 进行反向解析,解析出的域名并不是 [url]www.baidu.com[/url] ,因此 ISA 认为访问请求和第一条防火墙策略并不匹配。然后 ISA 将访问请求和第二条策略进行匹配,匹配成功后正从我们在日志中看到的那样,访问请求被第二条允许内网用户任意访问的策略放行了。
  
  我们可以总结一下,客户机使用 HTTP 协议访问时,目标网络取决于主机头,而访问者输入的主机头既可能是域名也有可能是 IP( 一般以域名居多 ); 。客户机使用其他协议访问时,目标网络一定是以 IP 进行描述 !
  现在我们考虑一下应该如果用 ISA 禁止用户访问某个目标网络,那这个目标网络应该如何描述,显然只用域名描述是不严谨的,除非你确信 DNS 反向解析的结果对你有利 ( 大部分情况下你会失望的 ) 。如果保险一些,我们应该用域名 +IP 来描述目标网络。以刚才的限制百度为例,用 nslookkup 查出 [url]www.baidu.com[/url] 的域名解析结果为 202.108.22.43 202.108.22.5 。创建一个计算机集将这两个地址包含进去,如下图所示。
  

  然后就可以在拒绝访问百度的策略中加入刚创建的计算机集,如下图所示,这样做效果如何大家可以自己试试看,肯定比只用域名要好得多。