Sun Java System Messaging Server 6.3 管理指南

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 的表中将保留连接较频繁的系统并进行计数,从而保持足够的信息以提供有效的限制。