ANVIL(8)                                                              ANVIL(8)

名称
       anvil - Postfix 会话计数与请求速率控制服务

摘要
       anvil [通用 Postfix 守护进程选项]

描述
       Postfix anvil(8) 服务用于维护客户端连接数和请求速率的统计信息,
       可防御以下两类客户端攻击行为:
       1. 建立过多并发会话
       2. 在可配置时间间隔内发送过多连续请求
       本服务需在 Postfix master(8) 服务管理下运行。

       下文中的 ident 参数表示(服务,客户端)组合标识。
       该标识的具体语法由调用方定义,anvil(8) 服务本身不做限制。

连接数/速率控制
       注册新连接需向 anvil(8) 发送请求:

           request=connect
           ident=标识字符串

       服务返回响应包含:
       1. 当前并发连接数
       2. 单位时间内的连接速率
       数据对应指定的(服务,客户端)组合:

           status=0
           count=数量
           rate=速率值

       注销连接需发送请求:

           request=disconnect
           ident=标识字符串

       服务返回确认响应:

           status=0

邮件速率控制
       注册邮件投递请求需发送:

           request=message
           ident=标识字符串

       服务返回指定组合的单位时间投递请求速率:

           status=0
           rate=速率值

收件人速率控制
       注册收件人请求需发送:

           request=recipient
           ident=标识字符串

       服务返回指定组合的单位时间收件人数量:

           status=0
           rate=速率值

TLS 会话协商速率控制
       (Postfix 2.3 及以上版本支持)

       注册新 TLS 会话请求(非缓存)需发送:

           request=newtls
           ident=标识字符串

       服务返回指定组合的单位时间新 TLS 会话请求速率:

           status=0
           rate=速率值

       仅查询不更新计数器的请求:

           request=newtls_report
           ident=标识字符串

       返回速率数据同上。

认证速率控制
       注册认证请求需发送:

           request=auth
           ident=标识字符串

       服务返回指定组合的单位时间认证请求速率:

           status=0
           rate=速率值

安全机制
       1. 运行环境隔离:
       - 不进行网络通信
       - 不与本地用户交互
       - 支持 chroot 隔离环境
       - 以低权限运行

       2. 状态管理:
       - 使用内存表存储近期客户端请求数据
       - 不持久化存储(因系统库不适用于高频更新场景)
       - 自动清理过期数据

       3. 内存优化:
       - 处理大量客户端时可能消耗较多内存
       - 可通过缩短统计时间单位降低内存占用

诊断日志
       日志输出方式:
       - 记录至 syslogd(8)
       - 或 postlogd(8)

       统计报告:
       - 服务退出时自动记录峰值数据
       - 每隔 anvil_status_update_time 秒记录一次
       - 包含:最大连接数/速率、对应客户端标识、发生时间
       - 无速率限制的服务不进行统计

已知限制
       1. NAT 环境问题:
       - 经过地址转换的客户端会被视为同一客户端
       - 可能导致误触发限制

       2. 并发处理限制:
       - 当前实现中,受限制的服务进程每次只能处理一个远程客户端
       - 如上报多客户端,仅记录最后上报的客户端状态

       3. 状态维护建议:
       - 即使未显式限制连接数,也应注册 connect/disconnect 事件
       - 确保速率统计数据的时效性

配置参数
       参数加载:
       - 低负载系统:配置变更自动生效(anvil 进程生命周期短)
       - 高负载系统:需执行 postfix reload 加速生效

       核心参数说明:
       anvil_rate_time_unit (60s)
              速率统计的时间单位(秒)

       anvil_status_update_time (600s)
              峰值数据记录间隔(秒)

       通用参数:
       config_directory
              配置文件目录(main.cf/master.cf)

       daemon_timeout (18000s)
              进程超时时间(5小时)

       ipc_timeout (3600s)
              进程间通信超时(1小时)

       max_idle (100s)
              空闲进程存活时间

       max_use (100)
              进程最大请求处理数

       运行时参数(只读):
       process_id
              进程ID
       process_name
              进程名称
       syslog_facility (mail)
              日志设施
       syslog_name
              日志名前缀

       Postfix 3.3+ 新增:
       service_name
              master.cf 中定义的服务名

相关文档
       smtpd(8) - SMTP 服务
       postconf(5) - 参数配置
       master(5) - 服务管理

参考指南
       TUNING_README - 性能调优手册

授权协议
       需随软件分发 Secure Mailer 许可证

版本历史
       自 Postfix 2.2 版本开始提供

作者信息
       Wietse Venema
       IBM T.J. Watson 研究院
       美国纽约州约克镇高地 704 号信箱,邮编 10598

       Wietse Venema
       Google 公司
       美国纽约州纽约市第八大道 111 号,邮编 10011

                                                                      ANVIL(8)