PROXYMAP(8) PROXYMAP(8)
名称
proxymap - Postfix 查找表代理服务
概述
proxymap [通用 Postfix 守护进程选项]
描述
proxymap(8) 服务提供只读或读写表查询功能,通过两种独立服务实现:
proxymap(只读)和 proxywrite(读写)。该服务的主要用途包括:
o 突破 chroot 限制。例如,处于 chroot 环境的 SMTP 服务器需要访问系统密码文件来验证本地地址,
但将密码文件复制到 chroot 环境并不现实。解决方案:
local_recipient_maps =
proxy:unix:passwd.byname $alias_maps
o 通过共享表连接减少总连接数。例如,每个 Postfix 守护进程都直接连接 MySQL 会导致
"连接数过多"错误。解决方案:
virtual_alias_maps =
proxy:mysql:/etc/postfix/virtual_alias.cf
此时总连接数仅受 proxymap 服务进程数量限制。
o 为不支持多写入器的表(如非 lmdb 的所有基于文件的表)提供单写入器功能。
proxymap(8) 服务支持以下操作请求:
open maptype:mapname flags
打开指定类型和名称的表。响应包含表类型相关标志
(用于区分固定字符串表和正则表达式表)。
lookup maptype:mapname flags key
查询指定键值。响应包含状态码和查询结果。
参数与 open 请求相同。
update maptype:mapname flags key value
更新指定键值。响应为状态码。
参数与 open 请求相同。
注意:要实现单写入器模式,需在 master.cf 中将 proxywrite 服务的
进程数限制设为 1。
(Postfix 2.5 及以上版本支持)
delete maptype:mapname flags key
删除指定键值。响应为状态码。
参数与 open 请求相同。
(Postfix 2.5 及以上版本支持)
sequence maptype:mapname flags function
遍历数据库。function 可以是 DICT_SEQ_FUN_FIRST 或 DICT_SEQ_FUN_NEXT。
响应包含状态码及找到的键值对。
(Postfix 2.9 及以上版本支持)
请求状态码包括:OK(成功)、RETRY(重试)、NOKEY(键不存在)、
BAD(请求格式错误)和 DENY(无访问权限)。
注:服务不提供 close 命令,连接断开时也不会自动关闭表,
这是为了实现多进程间的表共享。
服务进程管理
proxymap(8) 服务由 Postfix master(8) 主控进程管理。
每个服务进程可处理多路连接。当所有进程都处于忙碌状态时,
master(8) 会新建服务进程(不超过配置上限)。
服务进程在处理完 $max_use 个请求或空闲超过 $max_idle 秒后自动终止。
安全
proxymap(8) 服务仅访问通过 proxy_read_maps 或
proxy_write_maps 明确授权的表,且可以低权限运行(是否 chroot 均可)。
但 chroot 模式会限制实用性,因为只能访问 chroot 环境内的表。
注意:
1. 该服务不是可信进程,禁止用于查询敏感信息(如系统账号、文件路径等)
2. Postfix 2.2+ 会自动识别敏感表请求并直接访问
3. 可写数据应存放在 Postfix 专属目录(如 data_directory)
4. 禁止在系统目录存放可写文件,避免权限漏洞
诊断
所有操作日志均记录至 syslogd(8) 或 postlogd(8)。
已知问题
1. 不适用于高延迟查询(因需服务多客户端)
2. 读写服务不会显式关闭表(可能导致 CDB 等非事务性表不一致)
3. 建议使用支持事务的表(如 Berkeley DB)或专业数据库
配置参数
在繁忙系统中,proxymap(8) 相关配置需执行
"postfix reload" 才能及时生效。
主要参数摘要(详见 postconf(5)):
config_directory (参见 postconf -d 输出)
Postfix 主配置文件的默认存储路径
data_directory (参见 postconf -d 输出)
可写数据文件(缓存、随机数等)目录
daemon_timeout (18000 秒)
进程处理单个请求的最长耗时(超时自动终止)
ipc_timeout (3600 秒)
进程间通信的超时阈值
max_idle (100 秒)
空闲进程自动终止的超时时间
max_use (100)
单个进程处理的最大请求数
process_id (只读)
进程 ID
process_name (只读)
进程名称
proxy_read_maps (参见 postconf -d 输出)
允许只读访问的表
(Postfix 2.5+ 新增):
proxy_write_maps (参见 postconf -d 输出)
允许读写访问的表
(Postfix 3.3+ 新增):
service_name (只读)
服务在 master.cf 中的名称
参见
postconf(5) 配置参数
master(5) 守护进程配置
参考文档
DATABASE_README Postfix 表查询机制详解
许可
本软件遵循 Secure Mailer 许可协议
历史
该功能首次发布于 Postfix 2.0
作者
Wietse Venema
IBM T.J. Watson 研究中心
邮政信箱 704
美国纽约州约克镇高地 10598
Wietse Venema
Google 公司
纽约第八大道 111 号
美国纽约 10011
PROXYMAP(8)