POSTSCREEN(8) POSTSCREEN(8)
名称
postscreen - Postfix 僵尸程序拦截系统
概述
postscreen [通用 Postfix 守护进程选项]
描述
Postfix postscreen(8) 服务提供额外的邮件服务器过载防护机制。单个
postscreen(8) 进程可处理多个入站 SMTP 连接,并决定哪些客户端能与 Postfix
SMTP 服务器进程通信。通过拦截垃圾邮件机器人,postscreen(8) 能为合法客户端保留更多
SMTP 服务器进程资源,有效延缓服务器过载情况的发生。
注意:本程序不应部署在接收终端用户邮件客户端 (MUA) 连接的 SMTP 端口上。在典型配置中,
postscreen(8) 处理 TCP 25 端口的 MX 服务,而 smtpd(8) 通过需要客户端认证的
submission 服务 (TCP 587 端口) 接收 MUA 发来的邮件。另一种方案是设置专用的非 postscreen
的 "25 端口" 服务器,该服务器提供 submission 服务和客户端认证,但不提供 MX 服务。
postscreen(8) 会为通过多项测试的客户端维护临时白名单。当 SMTP 客户端 IP 地址被加入白名单后,
postscreen(8) 会立即将连接转交给 Postfix SMTP 服务器进程,从而最大限度减少合法邮件的处理开销。
默认情况下,postscreen(8) 会记录统计数据并将每个连接转交给 Postfix SMTP 服务器进程,
同时将 mynetworks 中的客户端排除在所有测试之外(主要是为了避免网络设备中非标准 SMTP
实现导致的问题)。此默认模式不会拦截任何客户端,适用于非破坏性测试。
在生产环境中,postscreen(8) 通常配置为拒绝未通过一项或多项测试的客户端发来的邮件。
postscreen(8) 会记录被拒邮件的客户端地址、HELO、发件人和收件人信息。
需要特别说明:postscreen(8) 并非 SMTP 代理,这是有意为之的设计。其核心目的是在
最大限度减少合法流量开销的同时,阻止垃圾邮件机器人访问 Postfix SMTP 服务器进程。
安全性
postscreen(8) 服务属于中等安全敏感级别。它会与网络上的不可信客户端通信。
该进程可以运行在固定低权限的 chroot 环境中。
标准规范
RFC 821 (SMTP 协议)
RFC 1123 (主机要求)
RFC 1652 (8bit-MIME 传输)
RFC 1869 (SMTP 服务扩展)
RFC 1870 (邮件大小声明)
RFC 1985 (ETRN 命令)
RFC 2034 (SMTP 增强状态码)
RFC 2821 (SMTP 协议)
注意:不支持 RFC 2920 (SMTP 流水线)
RFC 3030 (不支持 BINARYMIME 的 CHUNKING)
RFC 3207 (STARTTLS 命令)
RFC 3461 (SMTP DSN 扩展)
RFC 3463 (增强状态码)
RFC 5321 (SMTP 协议,包括多行 220 欢迎信息)
诊断
问题与事务会记录到 syslogd(8) 或 postlogd(8)。
已知问题
当前 postscreen(8) 内置的 SMTP 协议引擎不支持声明 AUTH 、 XCLIENT 或
XFORWARD 功能。如需在 25 端口提供这些服务,请不要启用可选的 "220 服务器欢迎信息后" 测试。
可选的 "220 服务器欢迎信息后" 测试可能导致来自不同 IP 地址重试邮件发送的客户端出现意外延迟。
原因在于:客户端通过这些测试后,必须断开连接并从相同 IP 地址重新连接才能发送邮件。
详见 POSTSCREEN_README 文档中 "220 SMTP 服务器欢迎信息后的测试" 章节的讨论。
配置参数
修改 main.cf 后不会自动生效,因为 postscreen(8) 进程可能持续运行数小时。
配置变更后请使用 "postfix reload" 命令重新加载。
下文仅提供参数摘要,完整说明及示例请参阅 postconf(5)。
注意:部分 postscreen(8) 参数实现了压力相关行为。此特性仅当默认参数值为
压力相关形式(如 ${stress?{X}:{Y}})或是具有压力相关默认值的 smtpd 参数($name)时才支持。
其他参数始终视为 stress 参数值为空字符串的情况。
兼容性控制
postscreen_command_filter ($smtpd_command_filter)
用于转换远程 SMTP 客户端命令的过滤机制。
postscreen_discard_ehlo_keyword_address_maps ($smtpd_discard_ehlo_keyword_address_maps)
按远程 SMTP 客户端地址索引的查找表,包含 postscreen(8) 服务器
不会在 EHLO 响应中返回的 EHLO 关键字列表(不区分大小写),如流水线、STARTTLS、认证等。
postscreen_discard_ehlo_keywords ($smtpd_discard_ehlo_keywords)
postscreen(8) 服务器不会在 EHLO 响应中返回的 EHLO 关键字列表(不区分大小写)。
Postfix 3.1 及以上版本支持:
dns_ncache_ttl_fix_enable (no)
启用针对未来 libc 不兼容性的解决方案。
Postfix 3.4 及以上版本支持:
postscreen_reject_footer_maps ($smtpd_reject_footer_maps)
可选的查找表,用于在 4XX 或 5XX 拒绝响应后附加额外信息。
Postfix 3.6 及以上版本支持:
respectful_logging (参见 'postconf -d' 输出)
避免在日志中暗示白名单优于黑名单的表述。
故障排查控制
postscreen_expansion_filter (参见 'postconf -d' 输出)
postscreen_reject_footer 属性扩展中允许使用的字符列表。
postscreen_reject_footer ($smtpd_reject_footer)
附加在 4XX 或 5XX 拒绝响应后的可选信息。
soft_bounce (no)
安全机制,用于保留本应退回给发件人的邮件队列。
前置代理控制
Postfix 2.10 及以上版本支持:
postscreen_upstream_proxy_protocol (空)
可选的前置代理使用的代理协议名称。
postscreen_upstream_proxy_timeout (5s)
postscreen_upstream_proxy_protocol 参数指定协议的超时时间。
永久允许/拒绝列表测试
此测试在远程 SMTP 客户端连接后立即执行。如果客户端被永久允许,
则会立即将其转交给 Postfix SMTP 服务器进程。
postscreen_access_list (permit_mynetworks)
远程 SMTP 客户端 IP 地址的永久允许/拒绝列表。
postscreen_blacklist_action (ignore)
在 Postfix 3.6 中更名为 postscreen_denylist_action。
邮件交换策略测试
当 postscreen(8) 配置为监控所有主备 MX 地址时,可以拒绝仅连接
到备份 MX 地址的客户端。对于小型站点,这需要将主备 MX 地址配置在
同一 MTA 上。大型站点则需要在主备 MTA 间共享 postscreen(8) 缓存,
但这会引入单点故障风险。
postscreen_allowlist_interfaces (static:all)
本地 postscreen(8) 服务器 IP 地址列表,非允许列表的远程 SMTP 客户端
可通过这些地址获取临时允许状态。
220 欢迎信息前测试
这些测试在远程 SMTP 客户端收到 "220 servername" 欢迎信息前执行。如果在此阶段完成后没有剩余测试,
客户端将立即被转交给 Postfix SMTP 服务器进程。
dnsblog_service_name (dnsblog)
master.cf 中 dnsblog(8) 服务条目的名称。
postscreen_dnsbl_action (ignore)
当远程 SMTP 客户端的综合 DNSBL 评分达到或超过阈值时(由
postscreen_dnsbl_sites 和
postscreen_dnsbl_threshold 参数定义),
postscreen(8) 将采取的操作。
postscreen_dnsbl_reply_map (empty)
包含密码的实际 DNSBL 域名与 postscreen 拒绝邮件时使用的 DNSBL 域名之间的映射。
postscreen_dnsbl_sites (empty)
可选的 DNS 黑白名单域名模式列表,包含过滤器和权重因子。
postscreen_dnsbl_threshold (1)
根据 postscreen_dnsbl_sites 参数定义的综合 DNSBL 评分,
拦截远程 SMTP 客户端的包含性下限。
postscreen_greet_action (ignore)
当远程 SMTP 客户端在 postscreen_greet_wait 参数指定的时间内
提前发送命令时,postscreen(8) 将采取的操作。
postscreen_greet_banner ($smtpd_banner)
postscreen(8) 在真实 Postfix SMTP 服务器的 "220 text..." 响应前发送的
可选 "220-text..." 服务器响应中的文本,用于干扰不良 SMTP 客户端使其提前发送命令(预问候)。
postscreen_greet_wait (normal: 6s, overload: 2s)
postscreen(8) 等待 SMTP 客户端在其轮次前发送命令,
以及等待 DNS 黑名单查询结果返回的时间限制(默认:高负载时最多 2 秒,正常情况最多 6 秒)。
smtpd_service_name (smtpd)
postscreen(8) 转交允许连接时使用的内部服务名称。
适用于 Postfix 2.11 及更高版本:
postscreen_dnsbl_whitelist_threshold (0)
在 Postfix 3.6 中更名为 postscreen_dnsbl_allowlist_threshold。
适用于 Postfix 3.0 及更高版本:
postscreen_dnsbl_timeout (10s)
DNSBL 或 DNSWL 查询的超时时间。
适用于 Postfix 3.6 及更高版本:
postscreen_denylist_action (ignore)
当远程 SMTP 客户端被 postscreen_access_list 参数
永久列入黑名单时,postscreen(8) 将采取的操作。
postscreen_allowlist_interfaces (static:all)
本地 postscreen(8) 服务器 IP 地址列表,非白名单的远程 SMTP 客户端
可通过这些地址获取 postscreen(8) 的临时白名单状态。
postscreen_dnsbl_allowlist_threshold (0)
根据 postscreen_dnsbl_sites 参数定义的综合 DNSBL 评分,
允许远程 SMTP 客户端跳过 "220 欢迎信息前" 和 "220 欢迎信息后" 协议测试的阈值。
220 欢迎信息后测试
这些测试在远程 SMTP 客户端收到 "220 servername" 欢迎信息后执行。如果客户端在此阶段通过所有测试,
它将收到对所有 RCPT TO 命令的 4XX 响应。客户端重新连接后,将被允许直接与 Postfix SMTP 服务器进程通信。
postscreen_bare_newline_action (ignore)
当远程 SMTP 客户端发送裸换行符(即前面没有回车符的换行符)时,
postscreen(8) 将采取的操作。
postscreen_bare_newline_enable (no)
是否在 postscreen(8) 服务器中启用 "裸换行符" SMTP 协议测试。
postscreen_disable_vrfy_command ($disable_vrfy_command)
是否在 postscreen(8) 守护进程中禁用 SMTP VRFY 命令。
postscreen_forbidden_commands ($smtpd_forbidden_commands)
postscreen(8) 服务器认为违反 SMTP 协议的命令列表。
postscreen_helo_required ($smtpd_helo_required)
是否要求远程 SMTP 客户端在开始 MAIL 事务前发送 HELO 或 EHLO。
postscreen_non_smtp_command_action (drop)
当远程 SMTP 客户端发送 postscreen_forbidden_commands
参数指定的非 SMTP 命令时,postscreen(8) 将采取的操作。
postscreen_non_smtp_command_enable (no)
是否在 postscreen(8) 服务器中启用 "非 SMTP 命令" 测试。
postscreen_pipelining_action (enforce)
当远程 SMTP 客户端不等待服务器响应就发送多条命令时,
postscreen_pipelining_enable (否)
是否在 postscreen(8) 服务器中启用 SMTP "流水线" 协议测试。
缓存控制
postscreen_cache_cleanup_interval (12h)
postscreen(8) 执行缓存清理的时间间隔
postscreen_cache_map (btree:$data_directory/postscreen_cache)
用于持久化存储 postscreen(8) 服务器决策结果的数据库
postscreen_cache_retention_time (7d)
临时白名单条目过期后,postscreen(8) 保留该记录的时间长度
postscreen_bare_newline_ttl (30d)
客户端 IP 通过"裸换行符"SMTP 协议测试后,postscreen(8) 记住该状态的有效期
postscreen_dnsbl_max_ttl
(${postscreen_dnsbl_ttl?{$postscreen_dnsbl_ttl}:{1}}h)
客户端 IP 通过基于 DNS 的信誉测试后,postscreen(8) 记住该状态的最长时间
postscreen_dnsbl_min_ttl (60s)
客户端 IP 通过基于 DNS 的信誉测试后,postscreen(8) 记住该状态的最短时间
postscreen_greet_ttl (1d)
客户端 IP 通过 PREGREET 测试后,postscreen(8) 记住该状态的有效期
postscreen_non_smtp_command_ttl (30d)
客户端 IP 通过"非 SMTP 命令"测试后,postscreen(8) 记住该状态的有效期
postscreen_pipelining_ttl (30d)
客户端 IP 通过"流水线"测试后,postscreen(8) 记住该状态的有效期
资源控制
line_length_limit (2048)
输入时行长度的最大限制(超出会被分段);投递时重新组合长行
postscreen_client_connection_count_limit
($smtpd_client_connection_count_limit)
单个远程 SMTP 客户端可与 postscreen(8) 守护进程建立的最大并发连接数
postscreen_command_count_limit (20)
postscreen(8) 内置 SMTP 协议引擎每个会话允许的最大命令数量
postscreen_command_time_limit (normal: 300s, overload: 10s)
postscreen(8) 读取完整命令行的时间限制(正常情况 300 秒,过载时 10 秒)
postscreen_post_queue_limit ($default_process_limit)
等待真实 Postfix SMTP 服务器服务的客户端最大数量
postscreen_pre_queue_limit ($default_process_limit)
等待 postscreen(8) 决定是否转交的非白名单客户端最大数量
postscreen_watchdog_timeout (10s)
postscreen(8) 进程响应客户端命令或执行缓存操作的最大允许时间,
超时将被内置看门狗终止
STARTTLS 控制
postscreen_tls_security_level ($smtpd_tls_security_level)
postscreen(8) 的 SMTP TLS 安全级别配置。当指定非空值时,
将覆盖已废弃的 postscreen_use_tls 和 postscreen_enforce_tls 参数
tlsproxy_service_name (tlsproxy)
master.cf 中 tlsproxy(8) 服务项的名称
废弃的 STARTTLS 支持控制
这些参数仅为保持与 smtpd(8) 传统参数的兼容性而保留
postscreen_use_tls ($smtpd_use_tls)
机会型 TLS:向远程 SMTP 客户端声明支持 STARTTLS,
但不强制要求使用 TLS 加密
postscreen_enforce_tls ($smtpd_enforce_tls)
强制 TLS 加密:向远程 SMTP 客户端声明支持 STARTTLS 命令,
并要求客户端必须使用 TLS 加密传输。
杂项控制
config_directory (参见 'postconf -d' 输出)
Postfix main.cf 和 master.cf 配置文件的默认存储位置
delay_logging_resolution_limit (2)
记录亚秒级延迟值时,小数点后保留的最大位数
command_directory (参见 'postconf -d' 输出)
所有 Postfix 管理命令的安装目录
max_idle (100s)
Postfix 守护进程在自愿终止前等待入站连接的最大空闲时间
process_id (只读)
Postfix 命令或守护进程的进程 ID
process_name (只读)
Postfix 命令或守护进程的进程名称
syslog_facility (mail)
Postfix 日志记录使用的 syslog 设施
syslog_name (参见 'postconf -d' 输出)
预置在 syslog 记录中进程名称前的字符串前缀,
例如将 "smtpd" 显示为 "prefix/smtpd"
Postfix 3.3 及以上版本可用:
service_name (只读)
Postfix 守护进程在 master.cf 中定义的服务名称
Postfix 3.5 及以上版本可用:
info_log_address_format (external)
非调试日志(信息、警告等)中使用的电子邮件地址格式
参见
smtpd(8), Postfix SMTP 服务器
tlsproxy(8), Postfix TLS 代理服务器
dnsblog(8), DNS 黑白名单记录器
postlogd(8), Postfix 日志服务
syslogd(8), 系统日志服务
说明文档
POSTSCREEN_README, Postfix 邮件筛选指南
许可
本软件必须随附 Secure Mailer 许可证
历史
本服务随 Postfix 2.8 版本引入
postscreen(8) 中的许多设计理念源自 Michael Tokarev 的早期工作,
以及 OpenBSD spamd 和 MailChannels Traffic Control 的相关实践
作者
Wietse Venema
IBM T.J. Watson 研究中心
邮政信箱 704 号
美国纽约州约克镇高地,邮编 10598
Wietse Venema
Google 公司
纽约第八大道 111 号
美国纽约州纽约市,邮编 10011
POSTSCREEN(8)