Sun Java System Messaging Server 6.3 管理指南

第 19 章 使用 MeterMaid 限制外来连接

MeterMaid 是一个服务器,可以对连接和事务进行集中测量和管理,方法包括监视 IP 地址和 SMTP 信封地址。就功能而言,MeterMaid 可用来限制某个特定 IP 地址连接到 MTA 的频率。限制特定 IP 地址的连接对于防止拒绝服务攻击中使用的过多连接很有用。MeterMaid 取代了 conn_throttle.so,它提供相似的功能,但通过 Messaging Server 安装扩展了这些功能。尚未计划对 conn_throttle.so 进行新的改进,MeterMaid 是一个更有效的替代选择。

本节包含以下几个部分:

19.1 技术概述

conn_throttle.so 是作为 MTA 映射表中的调用而使用的共享库,该映射表使用内存中的一个外来连接表来确定最近连接的特定 IP 地址何时太频繁,而应暂时转移出去。虽然有一个内存中的表有助于提高性能,但它最大的开销是每个服务器上的每个单独的进程都要维护自己的表。

在大多数情况下,conn_throttle.so 调用是在 PORT_ACCESS 映射中完成的,该映射通过分发程序(每个系统上的单个进程)访问。仅有的开销是每个服务器都有一个单独的表。

MeterMaid 的主要改进是,它维护限制信息的单个系统信息库,该限制信息可以被 Messaging Server 环境下的所有系统和进程访问。它继续维护一个内存中的数据库来存储数据,以获取最佳性能。重新启动 MeterMaid 将丢失所有以前存储的信息,但由于数据的生命周期通常很短,因此这样的重新启动(不是经常发生)所带来的损失也比较小。

19.2 操作原理

MeterMaid 的配置存储在 msg.conf 中,并通过 configutil 维护。

通过使用 check_metermaid.so 的映射表调用从 MTA 访问 MeterMaid。可以从任何 *_ACCESS 表中调用 MeterMaid。当从 PORT_ACCESS 表中调用时,MeterMaid 可基于连接的 IP 地址检查限制,这是实现 MeterMaid(替代原来的 conn_throttle.so)的最常用方法。如果从别的 *_ACCESS 表中调用,MeterMaid 也可用于对其他数据(如信封 From 或信封 To 地址,以及 IP 地址)建立限制。

check_metermaid.so 中只定义一个入口点。throttle 例程联系提供两个以逗号分隔的后续参数的 MeterMaid。第一个参数是用于检查数据的表的名称,第二个参数是要检查的数据。

如果探测得到的结果是,被检查的特定数据超过了它在该表中的配额,check_metermaid.so 将返回 "success",以便映射引擎继续处理该条目。该条目的剩余部分则用来处理超出配额的连接。


PORT_ACCESS

  *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E
  *|*|*|*|* $C$:A$[/opt/SUNWmsgsr/lib/check_metermaid.so,throttle,tablename,$3]$N421$ \
Connection$ declined$ at$ this$ time$E
  *          $YEXTERNAL

请注意,要在调用 check_metermaid.so. 之前处理映射表条目中的 $:A 标志测试,这确保只有在分发程序检查 PORT_ACCESS 时才执行 MeterMaid 探测,因为分发程序将为探测设置 A 标志。

19.3 为 MeterMaid 配置参数

MeterMaid 的配置存储在 msg.conf 中,并通过 configutil 维护。下面是 MeterMaid 当前支持的设置:括号中是默认值。有关 MeterMaid 参数的完整列表,请参见《Sun Java System Messaging Server 6.3 Administration Reference》中的“configutil Parameters”

以下设置供 check_metermaid 客户端使用:

最后,也会在 msg.conf 中定义限制表,如下所示。 每个配置参数中的 * 是被定义的特定表的名称。例如,对于名为 internal 的表,第一个参数应为 metermaid.table.internal.data_type.

19.4 示例 — 使用 Metermaid 限制过多的 IP 地址连接

本示例使用 MeterMaid 将 IP 地址限制为每分钟 10 次连接。下面给出映射文件中等效的 conn_throttle.so 设置供参考:


PORT_ACCESS
   *|*|*|*|*  $C$|INTERNAL_IP;$3|$Y$E
   *|*|*|*|*  $C$[/opt/SUNWmsgsr/lib/conn_throttle.so,throttle,$3,10]\
$N421$ Connection$ declined$ at$ this$ time$E
   *          $YEXTERNAL

PORT_ACCESS 映射表实现了 conn_throttle.so,将非 INTERNAL 连接限制为每分钟不超过 10 次连接的速率。

这两种技术之间的一个基本区别是,MeterMaid 不是直接将速率限制之类的细节配置到映射表中,而是使用 configutil 参数进行设置。下面介绍了此示例。

  1. 指定某一系统为 MeterMaid 服务器主机。

    在此系统中,设置以下 configutil 参数:


    local.metermaid.enable -v TRUE 

    设置一个验证密码,用于验证客户端和 MeterMaid 服务器之间的通信:


    configutil -o metermaid.config.secret -v password
    
  2. 定义一个限制表。

    MeterMaid 的限制行为由指定限制表的使用决定,这些表定义了操作特性。定义一个将连接速率限制为每分钟 10 次的表,请设置以下参数:


    configutil -o metermaid.table.ext_throttle.data_type -v ipv4
    configutil -o metermaid.table.ext_throttle.quota -v 10

    ext_throttle 是限制表的名称。ipv4 是数据类型 Internet 协议版本 4 地址的表示形式。10 是配额(连接限制)。

  3. 在 MeterMaid 系统上, 启动 MeterMaid。


    # start-msg metermaid
  4. 在 MTA 将使用 MeterMaid 进行限制的系统上,指定 MeterMaid 主机和密码

    需要进行以下设置:


    configutil -o metermaid.config.secret -v MeterMaid_Password
    configutil -o metermaid.config.serverhost -v name_or_ipaddress_of_MetermaidHost
    
  5. 设置 MeterMaid PORT_ACCESS 表。

    此表类似于等效的 conn_throttle.so 设置:


    PORT_ACCESS
    
       *|*|*|*|*  $C$|INTERNAL_IP;$3|$Y$E
       *|*|*|*|*  $C$:A$[/opt/SUNWmsgsr/lib/check_metermaid.so,throttle,\
    ext_throttle,$3] $N421$ Connection$ declined$ at$ this$ time$E
       *          $YEXTERNAL

    第一行检验尝试连接的 IP 地址是否是内部的。如果是,则允许连接。第二行通过 MeterMaid 执行 IP 地址检查,如果该 IP 地址连接过于频繁则减少连接次数。第三行允许任何其他标记为 EXTERNAL 的连接通过。

    请注意,此 check_metermaid.so 的调用与 conn_throttle.so 的调用非常相似。check_metermaid.so 中的函数是相同的。throttle 及其参数就是使用 metermaid.table.tablename 配置的表名称和要检查的 IP 地址 ($3)。与 conn_throttle.so 一样,在达到限制(在metermaid.table.ext_throttle.quota 中指定)时,此函数返回 success。这将允许处理映射条目行的剩余部分,向远程 SMTP 客户端发送一则消息(421 SMTP 代码,瞬态负完成,此时不接受连接),并通知分发程序关闭连接。

    同时要注意,$:A 确保仅在从分发程序调用时才处理此行。若没有该项,还将在 tcp_smtp_server 进程的上下文中将调用 check_metermaid.so,并探测 PORT_ACCESS 映射表。这将导致 MeterMaid 对每个外来连接计数 2 次。

这就是将 MeterMaid 设置为 conn_throttle.so 的替代方案的基本配置。有关这些主题的信息,请参见10.3.2 映射操作18.3.4 PORT_ACCESS 映射表

19.4.1 其他有用的 MeterMaid 选项

有两个其他的配置选项在某些环境下可能很有用。conn_throttle.so 共享库还有一个 throttle_p 函数,它通过推算超出 60 秒(基本值)的延长时间段,阻止超过限制的连接。通过在 MeterMaid 服务器系统上配置以下选项,可以在 MeterMaid 中实现相同的行为:


configutil -o metermaid.table.ext_throttle.options -v penalize

这将更改 ext_throttle 表的行为,以便在连接尝试次数大于为 metermaid.table.ext_throttle.quota 设置的值时,可以阻止连接。

另一个选项与接收大量连接的系统有关。由于 MeterMaid 能够跟踪整个分布式 MTA 环境中的连接,因此 MeterMaid 内部的内存数据库中所保留的连接的数量限制对于 MTA 环境的总体容量可能会不足。 默认值是每个表 1000 个条目,但如果您希望整个 MTA 环境中每分钟的连接数超过 1000,则可以通过以下配置选项增加连接数:


configutil -o metermaid.table.ext_throttle.max_entries -v max_entries

请注意,即使在 60 秒内达到了 max_entries,MeterMaid 仍会自动丢弃最早的和最少使用的条目。因此,在 MeterMaid 的表中将保留连接较频繁的系统并进行计数,从而保持足够的信息以提供有效的限制。