Sun Java System Messaging Server 6 2005Q4 管理指南

域位置确定

user@domain 格式的地址启动时,地址转换和路由进程将首先检查 domain 是否是本地域。

重写规则机制

MTA 重写规则机制添加了新的功能,可以检查给定字符串是否为需要在本地处理的域。通过 $V$Z 元字符可以激活此新增功能。这些新增元字符在句法上与现有的 $N$M$Q$C 元字符类似,即这些元字符之后都要跟模式字符串。就 $N$M$Q$C 而言,此模式与源通道或目标通道相匹配。就 $V$Z 而言,此模式是一个域,并将检查该域是否为本地域。$V 导致非本地域的规则失败,$Z 导致本地域的规则失败。

按以下过程可以实现对这些元字符的处理:

  1. Messaging Server 将检查当前域与目录中的有效域条目是否匹配。如果不存在该条目,则转至步骤 3。

  2. 如果目录中有该域的条目,则将从域条目中检索由 LDAP_DOMAIN_ATTR_ROUTING_HOSTS MTA 选项(默认值为 mailRoutingHosts)指定的属性。如果存在该属性,它将列出能够处理该域中的用户的一组主机。该列表将与由 local.hostname configutil 参数指定的主机和由 local.imta.hostnamealiases configutil 参数指定的主机列表进行对比。这些选项可以分别由 LDAP_LOCAL_HOSTLDAP_HOST_ALIAS_LIST MTA 选项覆盖。 如果存在匹配或者域中不存在该属性,则该域为本地域。如果未出现匹配,则该域为非本地域。

    由于 mailRoutingHosts 属性取决于 ROUTE_TO_ROUTING_HOST MTA 选项的设置,因此将这些域作为非本地域进行处理。如果将选项设置为 0(默认设置),地址将仅被视为非本地地址,MTA 重写规则用于确定路由。如果将选项设置为 1,源路由(由 LDAP_DOMAIN_ATTR_ROUTING_HOSTS MTA 选项中列出的第一个值组成)将被附加到地址之前。

  3. 如果找不到任何域条目,则从域的左侧删除组件,然后转至步骤 1。如果没有剩余组件,则继续执行步骤 4。

    回溯域树的结果就是如果 siroe.com 被识别为本地域,则 siroe.com 的任何子域均将被识别为本地域。也可能会出现不需要这么做的情况,因此提供了 MTA 选项 DOMAIN_UPLEVEL 来控制该性能。特别是,如果清除 DOMAIN_UPLEVEL 的位 0(值为 1),则会禁用删除域组件的重试操作。DOMAIN_UPLEVEL 的默认值为 0。

  4. 现在需要执行虚名域检查。虚名域没有域条目,而是通过将特定的域属性附加到一个或多个用户条目指定的。通过使用由 DOMAIN_MATCH_URL MTA 选项指定的 LDAP URL 来执行 LDAP 搜索可以完成虚名域检查。应该将该选项的值设置为:

    ldap:///$B?msgVanityDomain?sub?(msgVanityDomain=$D)

    $B 将替换 local.ugldapbasedn configutil 参数的值;这是目录中用户树的基目录。LDAP_USER_ROOT MTA 选项专用于为 MTA 覆盖该 configutil 选项的值。

    该搜索的实际返回值并不重要。重要的是,是否会返回值。如果返回值,该域将被视为本地域;如果未返回值,该域将被视为非本地域。

域位置的域映射确定

提醒您注意在目录中查找有效域条目执行哪些步骤。这些步骤是特定于模式级别的。就 Sun LDAP Schema 1 而言,这些步骤包括:

  1. 将域转换为域树中的基本 DN。通过将域转换为一系列 dc 组件,然后添加域根后缀可以完成此操作。默认后缀可通过 service.dcroot configutil 参数获得。默认后缀为 o=internet。因此 a.b.c.d 格式的域通常被转换为 dc=a,dc=b,dc=c,dc=d,o=internet。通过设置 LDAP_DOMAIN_ROOT MTA 选项可以覆盖 service.dcroot configutil 参数。

  2. 查找具有在步骤 1 中找到的基本 DN 的条目,以及对象类为 inetDomaininetDomainAlias 的条目。通过设置 LDAP_DOMAIN_FILTER_SCHEMA1 MTA 选项(默认设置为 (|(objectclass=inetDomain)(objectclass=inetdomainalias)))可以覆盖用于此目的的搜索过滤器。

  3. 如果未找到任何条目,则以失败退出。

  4. 如果找到条目的对象类为 inetDomain,请检查以确保该条目具有与域条目相关联的 inetDomainBaseDn 属性。如果存在该属性,系统会将其保存以供后续搜索用户条目以及终止处理时使用。如果不存在该属性,则假定该条目为域别名,并继续进行步骤 5。MTA 选项 LDAP_DOMAIN_ATTR_BASEDN 可用于覆盖 inetDomainBaseDN 的使用。

  5. 条目必须为域别名;查找 aliasedObjectName 属性所引用的新条目并返回步骤 4。如果不存在 aliasedObjectName 属性,则处理过程会因故障而终止。可以通过 MTA 选项 LDAP_DOMAIN_ATTR_ALIAS 指定 aliasedObjectName 属性的替代使用方法。

    请注意,处理最多只能返回步骤 4 一次;不允许使用指向域别名的域别名。

在 Sun LDAP Schema 2 中,所采取的操作更简单:搜索目录,查找具有对象类 sunManagedOrganization 的条目,其中域显示为 sunPreferredDomainassociatedDomain 属性的值。如果需要,可以使用 MTA 选项 LDAP_ATTR_DOMAIN1_SCHEMA2LDAP_ATTR_DOMAIN2_SCHEMA2 分别覆盖用于此目的的 sunPreferredDomainassociatedDomain 属性的使用。在由 service.dcroot configutil 参数指定的根目录下执行搜索。通过设置 LDAP_DOMAIN_ROOT MTA 选项可以覆盖 service.dcroot configutil 参数。此外,Schema 2 中的域条目不需要具有 inetDomainBaseDn 属性;如果没有这些属性,用户树的基目录将被假定为域条目本身。

缓存域位置信息

由于执行域重写操作很频繁并且目录查询(尤其是虚名域检查)很耗时,因此需要缓存有关域的负向和正向指示。使用内存中的开放链的动态扩展散列表可以实现此操作。通过 DOMAIN_MATCH_CACHE_SIZE MTA 选项(默认值为 100000)可以设置高速缓存大小的最大值,通过 DOMAIN_MATCH_CACHE_TIMEOUT MTA 选项(默认值为 600 秒)可以设置高速缓存中条目的超时值。

错误处理

必须小心处理在此过程中出现的临时服务器故障,发生这些故障以后,系统将无法知道给定域是否为本地域。在这种情况下,基本上会出现两种结果:

  1. 将临时 (4xx) 错误返回客户机,通知其稍后重试该地址。

  2. 接受该地址,但将其排入到重新处理的通道,这样可以在本地稍后重试该地址。

这些选项并不适合所有的情况。例如,当与远程 SMTP 中继通话时,则对应于结果 1。但处理来自本地用户的 SMTP 提交时,则对应于结果 2。

虽然从理论上来说,可以通过在同一模式下使用多个规则来处理临时故障,但是,即使具备高速缓存,由于重复进行此类查询所带来的系统开销也无法接受。由于这些原因,域重写的简单成功/失败转到下一规则匹配的模型是不足的。在域查找失败的情况下,将使用通过 MTA 选项 DOMAIN_FAILURE 指定的特殊模板。$V 操作失败后,该模板将替换要处理的当前重写规则模板的剩余部分。

域检查重写规则的模式

在有可能运行其他重写规则操作之前,需要先执行该域检查。通过在规则的左侧使用特殊的 $* 可以确保此要求。在检查所有其他规则之前,先检查 $* 模式。

汇总所有机制

考虑到目前为止所述的所有机制,imta.cnf 中所需的新重写规则为:

$*     $E$F$U%$H$V$H@localhost

并且 option.dat 文件中的DOMAIN_FAILURE MTA 选项的值应为:

reprocess-daemon$Mtcp_local$1M$1~-error$4000000?Temporary lookup failure

在此重写规则中,localhost 是与本地通道相关联的主机名。此处所示的 DOMAIN_FAILURE 选项的值是默认值,因此在一般环境下不需要将该值显示在 option.dat 中。

此处的排序特别需要慎重对待。MTA 对 $V 的检查应在重新建立地址后以及在添加路由前进行。在临时查找失败的情况下,MTA 将更改路由。只要插入点发生了更改,就将应用暂挂通道匹配检查,以使第二个 $H 之后的 @ 调用检查。如果检查成功,将应用模板的剩余部分并重写处理结论。如果检查失败,重写就会失败,重写将继续执行下一个适用的重写规则。如果由于临时故障而无法执行检查,将使用通过 DOMAIN_FAILURE MTA 选项指定的值继续进行模板处理。首先,使用该模板的值将路由主机设置为 reprocess-daemon。然后,模板将检查 MTA 是否正在处理某类重新处理通道或 tcp_local。如果 MTA 正在处理此类通道,则规则将继续,因此使路由主机非法并将临时故障指定为结果。如果 MTA 没有处理此类通道,则规则将被截断并成功终止,因此将地址重写到重新处理通道。