文档目的
本文档提供多种典型 Postfix 配置方案。请确保在阅读本文档前已完成 BASIC_CONFIGURATION_README 文档中描述的基础配置步骤。特别提醒:若您尚未实现 Postfix 的本地邮件提交与投递功能,请勿继续阅读。
文档第一部分展示解决特定问题的标准配置方案:
第二部分针对特殊环境提供附加配置:
独立互联网主机配置
对于直接连接互联网的独立主机,Postfix 应无需修改即可正常运行。通过 http://www.postfix.org/ 下载源代码安装时即为此默认配置。
使用命令 "postconf -n" 可查看 main.cf 覆盖的配置项。除必要路径设置外,独立主机通常只需保持 BASIC_CONFIGURATION_README 文档中的默认配置:
/etc/postfix/main.cf: # 可选:使用 user@domainname 替代 user@hostname 作为发件人 #myorigin = $mydomain # 可选:指定 NAT / 代理外部地址。 #proxy_interfaces = 1.2.3.4 # 替代方案 1:禁止转发其他主机的邮件。 mynetworks_style = host relay_domains = # 替代方案 2:仅转发本地客户端邮件。 # mynetworks = 192.168.1.0/28 # relay_domains =
若适用,请参考章节 无合法主机名的主机配置。
空客户端配置
空客户端指仅能发送邮件的主机,不接收网络邮件也不进行本地投递,通常通过 POP/IMAP/NFS 访问邮箱。
假设互联网域名为 "example.com",主机名为 "hostname.example.com"。以下仅展示需修改的非默认参数:
1 /etc/postfix/main.cf: 2 myhostname = hostname.example.com 3 myorigin = $mydomain 4 relayhost = $mydomain 5 inet_interfaces = loopback-only 6 mydestination =
配置说明:
- 第 2 行:设置全限定域名(可通过 postconf -d myhostname 验证当前值)。
- 第 2 行: 同时自动设置 mydomain 参数为 "example.com"。
- 第 3 行: 统一使用 "[email protected]" 发件地址,避免使用主机专属地址。
- 第 4 行: 将所有邮件路由至域名的负责服务器,防止因客户端关机导致邮件滞留。如果 "example.com" 域名没有 MX 记录,请在此处指定一个真实的主机名。
- 第 5 行: 禁用网络邮件接收。
- 第 6 行: 关闭本地投递功能。 所有邮件都会转发到第 4 行指定的邮件服务器。
局域网环境配置
本方案适用于包含一台主邮件服务器和多个邮件收发节点的局域网环境。假设网络域名为"example.com",所有系统需配置以下功能:
统一使用"[email protected]"作为发件人地址
各主机接收发往"[email protected]"的邮件
主服务器(mailhost.example.com)同时接收"[email protected]"的邮件
注意:此配置会导致root等系统账户邮件也被发送至中央服务器,解决方案详见章节 部分账户本地投递。
标准节点配置(非邮件主机)
仅需修改以下非默认参数:
/etc/postfix/main.cf: myorigin = $mydomain # 使用统一域名作为发件人 mynetworks = 127.0.0.0/8 10.0.0.0/24 # 定义可信网络范围 relay_domains = # 禁止开放转发 # 可选:无直连互联网时启用邮件中继 #relayhost = $mydomain
主邮件服务器配置
DNS:
example.com IN MX 10 mailhost.example.com.
/etc/postfix/main.cf:
myorigin = $mydomain
mydestination = $myhostname localhost.$mydomain localhost $mydomain
mynetworks = 127.0.0.0/8 10.0.0.0/24
relay_domains =
# 可选:需通过防火墙转发时启用
#relayhost = [firewall.example.com] # []表示禁用 MX 查询
关键配置说明:
DNS 记录:必须包含末尾点号(.),声明mailhost为域名的邮件交换服务器。
mydestination:声明本机负责投递的域名列表(含主域名和主机名)。
relayhost:适用于邮件主机必须通过防火墙上的邮件服务器转发非本地邮件的情况,方括号强制禁用 MX 查询,直接使用指定主机。详见 Postfix 邮件防火墙 / 网关。
邮箱访问方案
用户可通过以下方式访问邮件:
网络存储方案:通过 NFS 等共享文件系统访问。
协议访问:使用 POP3 / IMAP 协议收取。
个人主机投递:在邮件主机设置别名转发至指定主机。
别名表示例:
/etc/aliases:
joe: [email protected] # Joe 的邮件转发至个人主机
jane: [email protected]
注意:
别名文件位置可通过 postconf alias_maps 命令查询。
每次修改后需执行 newaliases 命令更新数据库。
邮件防火墙 / 网关配置
当 relay_domains= example.com 时,构建满足以下要求的邮件防火墙:
转发发往 "example.com" 的邮件。
拒绝 "*.example.com" 的子域名邮件。
要求 Postfix ≥ 2.0 版本(通过 postconf mail_version 验证)。
基础安全加固
/etc/postfix/main.cf: myorigin = example.com # 统一发件域名 mydestination = # 禁用本地域名投递 local_recipient_maps = # 清空本地收件人映射 local_transport = error:local mail delivery is disabled # 禁用本地传输 /etc/postfix/master.cf: # 注释掉 local 邮件传输服务
防火墙必选账户处理规范
基于技术合规性要求,邮件防火墙必须实现以下核心功能:
postmaster@[防火墙IP] 接收能力
RFC 标准强制要求:所有邮件系统必须能接收发往 postmaster@[服务器IP] 的邮件
实际监测表明:部分网络服务会主动向该地址发送状态报告
abuse@[防火墙IP] 接收能力(推荐实现)
行业最佳实践:提供标准化滥用投诉接收地址
法律合规需求:部分司法管辖区要求必须处理滥用投诉
技术实现方案
/etc/postfix/main.cf: virtual_alias_maps = hash:/etc/postfix/virtual # 启用虚拟别名映射 /etc/postfix/virtual: postmaster [email protected] # 转发至内部管理员 abuse [email protected] # 转发至安全团队
技术实现原理
核心机制
当 mydestination 参数为空时,Postfix 的地址处理遵循特殊规则:
IP 地址邮件识别
仅接受发往 localpart@[IP 地址] 格式的邮件,其中 IP 地址必须属于:$inet_interfaces 定义的监听接口
$proxy_interfaces 定义的代理接口
虚拟地址解析
通过 canonical(5) 和 virtual(5) 处理流程:
"user@[192.168.1.1]" → 自动提取为 "user" → 匹配虚拟别名表
安全优势
信息隐藏
无需在配置中暴露内部网络拓扑
避免硬编码防火墙IP地址
合规保障
完全符合:RFC 5321第4.5.1节(postmaster 邮箱强制要求)
RFC 2142第4节(abuse 邮箱规范建议)
运维验证
必须通过以下方式确保功能正常:
# 测试 postmaster 可达性 echo "Test" | mail -s "Firewall Test" postmaster@[防火墙 IP] # 检查邮件队列 mailq # 验证转发路径 postmap -q postmaster /etc/postfix/virtual
核心转发规则
解决方案的最后一部分是进行电子邮件转发,这是防火墙电子邮件功能的真正目的。
/etc/postfix/main.cf: # 网络与权限控制 mynetworks = 127.0.0.0/8 12.34.56.0/24 relay_domains = example.com parent_domain_matches_subdomains = debug_peer_list smtpd_access_maps
# Postfix ≥ 2.10版本(推荐): smtpd_relay_restrictions = permit_mynetworks reject_unauth_destination smtpd_recipient_restrictions = ...反垃圾邮件规则.... # 旧版兼容配置:
smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination ...反垃圾邮件规则.... # 收件人验证与路由 relay_recipient_maps = hash:/etc/postfix/relay_recipients transport_maps = hash:/etc/postfix/transport
/etc/postfix/relay_recipients: [email protected] x # 有效收件人列表 [email protected] x . . . # 防止队列积压 /etc/postfix/transport: example.com relay:[inside-gateway.example.com] # 强制路由至内网网关
实施要点:
- 第 1-10 行: 接受来自$mynetworks 中本地系统的邮件,接受 "[email protected] "的外部邮件,但不接受 "[email protected] "的外部邮件。 神奇之处在于第 4-5 行。
- 第 11、13-16 行: 定义 "example.com "域中可接收互联网邮件的有效地址列表。 这样可以防止邮件队列中塞满无法投递的 MAILER-DAEMON 邮件。 如果无法维护有效收件人列表,则必须指定"relay_recipient_maps="(即空值),或者在 relay_recipients 表中指定"@example.com x "通配符。
- 第 12、19-20 行: 将 "example.com "的邮件路由到内部网关机器。 []会强制 Postfix 不进行 MX 查询。 这将使用 "中继 "发送传输(默认 "smtp "发送传输的副本)来转发入站邮件。 这可以提高向内部域投递邮件的性能,因为这些邮件将与 "中继 "投递传输竞争 SMTP 客户端,而不是与其他 SMTP 投递竞争默认 "smtp "投递传输的 SMTP 客户端。
如果系统使用dbm文件而不是db文件,请指定dbm而不是hash。 要了解 Postfix 支持哪些查找表,请使用"postconf -m"命令。
每当更改relay_recipients 表时,执行命令"postmap /etc/postfix/relay_recipients"。
在更改传输表时,执行"postmap /etc/postfix/transport" 命令。
在某些安装中,多主机防火墙上可能会有不同的 Postfix 实例处理入站和出站邮件。 入站 Postfix 实例的 SMTP 服务器监听外部防火墙接口,出站 Postfix 实例的 SMTP 服务器监听内部接口。 在这样的配置中,只在每个实例中配置相应接口地址的$inet_interfaces很有吸引力。
在大多数情况下,以这种方式使用inet_interfaces是行不通的,因为正如$inet_interfaces参考手册中所述,smtp(8)发送代理也会使用指定的接口地址作为向外连接的源地址,从而无法连接到防火墙 "另一侧 "的主机。 其症状是防火墙无法连接到实际上处于运行状态的主机。 有关建议的解决方法,请参阅inet_interfaces参数文档。
在本地发送部分账户而非全部账户的邮件
以 "[email protected]"(而不是 "[email protected]")发送邮件的一个缺点是,"root "和其他系统账户的邮件也会发送到中央邮件主机。 为了在本地发送这些账户,可以设置如下虚拟别名:
1 /etc/postfix/main.cf: 2 virtual_alias_maps = hash:/etc/postfix/virtual 3 4 /etc/postfix/virtual: 5 root root@localhost 6 . . .
翻译:
- 第 5 行: 如virtual(5)手册页面所述,当 "site "等于 $myorigin、"site "列在$mydestination 中或与$inet_interfaces或$proxy_interfaces 匹配时,裸名称 "root "与 "root@site "匹配。
编辑文件后,执行命令"postmap /etc/postfix/virtual"。
在防火墙后运行 Postfix
在防火墙后的主机上设置 Postfix 的最简单方法是将所有邮件发送到网关主机,并由该邮件主机负责内部和外部转发。 有关示例见上文局域网部分。 更复杂的方法是只向网关主机发送外部邮件,而直接发送内部网邮件。
注意:本例需要 Postfix 2.0 或更高版本。 要了解 Postfix 的版本,请执行命令"postconf mail_version"。
下面的示例介绍了附加配置。 您需要将其与本文前半部分讨论的基本配置信息结合起来。
1 /etc/postfix/main.cf: 2 transport_maps = hash:/etc/postfix/transport 3 relayhost = 4 # 适用于非 "始终开机 "的机器 5 #fallback_relay = [gateway.example.com] 6 7 /etc/postfix/transport: 8 # 内部交付。 9 example.com : 10 .example.com : 11 # 外部交付。 12 * smtp:[gateway.example.com]
翻译:
- 第 2、7-12 行: 要求直接投递内网邮件,将外部邮件交给网关。 显然,本示例假定组织内部使用 DNS MX 记录。 []会强制 Postfix 不进行 MX 查询。
- 第 3 行: 重要: 不要在main.cf 中指定relayhost。
- 第 5 行: 这样可以防止关机时邮件滞留在队列中。 Postfix 会尝试直接投递邮件,并将无法投递的邮件交给网关。
如果您的系统使用dbm文件而不是db文件,请指定dbm而不是hash。 要了解 Postfix 支持哪些查找表,请使用"postconf -m"命令。
在编辑传输表时,执行命令"postmap /etc/postfix/transport"。
将 Postfix 配置为远程站点的主用或备用 MX 主机
本节介绍附加配置。 您需要将其与本文前半部分讨论的基本配置信息结合起来。
当您的系统是远程站点的第二 MX 主机时,这就是您所需要的全部信息:
1 DNS: 2 the.backed-up.domain.tld IN MX 100 your.machine.tld. 3 4 /etc/postfix/main.cf: 5 relay_domains = . . . the.backed-up.domain.tld
6a # Postfix 2.10 及更高版本支持单独的中继控制和垃圾邮件控制。 7a # 8a smtpd_relay_restrictions = 9a permit_mynetworks reject_unauth_destination 10a smtpd_recipient_restrictions = ...垃圾邮件拦截规则....
6b # 旧版配置结合了中继控制和垃圾邮件控制。 7b # 要在 Postfix ≥ 2.10 中使用,请指定"smtpd_relay_restrictions="。 8b smtpd_recipient_restrictions = 9b permit_mynetworks reject_unauth_destination 10b ...垃圾邮件拦截规则....
11 # 您必须指定 NAT/代理外部地址。 12 #proxy_interfaces = 1.2.3.4 13 14 relay_recipient_maps = hash:/etc/postfix/relay_recipients 15 16 /etc/postfix/relay_recipients: 17 [email protected] x 18 [email protected] x 19 . . .
当您的系统是远程站点的主要 MX 主机时,您需要具备以上条件:
20 /etc/postfix/main.cf: 21 transport_maps = hash:/etc/postfix/transport 22 23 /etc/postfix/transport: 24 the.backed-up.domain.tld relay:[their.mail.host.tld]
重要注意事项:
- 不要在mydestination 中列出备份的.domain.tld。
- 不要在virtual_alias_domains 中列出备份的.domain.tld。
- 不要在virtual_mailbox_domains 中列出.backed-up.domain.tld。
- 第 1-9 行: 将来自互联网的 "the.backed-up.domain.tld "邮件转发到该域的主 MX 主机。
- 第 12 行:如果 Postfix 通过 NAT 中继站或代理接收邮件,向世界展示的 IP 地址与本地机器不同,则必须执行此操作。
- 第 14-18 行: 定义 "the.backed-up.domain.tld "域中的有效地址列表。 这样可以防止邮件队列中塞满无法投递的 MAILER-DAEMON 邮件。 如果无法维护有效收件人列表,则必须指定"relay_recipient_maps="(即空值),或者在 relay_recipients 表中指定"@the.backed-up.domain.tld x "通配符。
- 第 24 行:[]会强制 Postfix 不进行 MX 查询。
如果您的系统使用dbm文件而不是db文件,请指定dbm而不是hash。 要了解 Postfix 支持哪些查找表,请使用"postconf -m"命令。
每当更改传输表时,执行"postmap /etc/postfix/transport"命令。
Postfix < 2.2 的注意事项: 为备份或主 MX 域中继邮件时,请勿使用fallback_relay功能。 当最终目的地不可用时,邮件将在 Postfix MX 主机和fallback_relay主机之间循环。
- 在main.cf中指定"relay_transport = relay"、
- 在master.cf中,在中继条目的末尾指定"-o fallback_relay ="。
- 在传输映射中,指定"relay:nexthop... "作为备份或主 MX 域项的右侧。
这些是 Postfix 2.2 及更高版本的默认设置。
拨号计算机上的 Postfix
本节适用于大部分时间处于停机状态的拨号连接。 对于全天候运行的拨号连接,请参阅上文的局域网部分。
本节将介绍其他配置。 您需要将其与本文前半部分讨论的基本配置信息结合起来。
如果您没有自己的主机名和 IP 地址(通常使用拨号、有线电视或 DSL 连接),则还应学习"Postfix 在没有真实 Internet 主机名的主机上的运行 "一节。
将所有外发邮件路由到网络提供商。
如果您的机器大部分时间都处于断线状态,那么 Postfix 就没有太多机会将邮件发送到互联网上难以到达的角落。 最好是把邮件交给一直连接的机器。 在下面的示例中,[]阻止 Postfix 尝试查找 DNS MX 记录。
/etc/postfix/main.cf: relayhost = [smtprelay.someprovider.com]
- 禁用自发 SMTP 邮件递送(如果仅使用按需拨号 IP)。
- 通常情况下,Postfix 会在方便时尝试向外发送邮件。 如果您的机器使用按需拨号 IP,则每当您提交新邮件时,以及每当 Postfix 重试投递延迟邮件时,系统都会拨打电话。 要防止此类电话呼叫,请禁用自发 SMTP 邮件递送。
/etc/postfix/main.cf: defer_transports = smtp (Only for on-demand dialup IP hosts)
禁用 SMTP 客户端 DNS 查找(仅限拨号局域网)。
/etc/postfix/main.cf: disable_dns_lookups = yes (Only for on-demand dialup IP hosts)
- 每当建立互联网链接时,都要清空邮件队列。
- 在 PPP 或 SLIP 拨号脚本中输入以下命令:
/usr/sbin/sendmail -q (whenever the Internet link is up)
- Postfix sendmail 命令的具体位置因系统而异。 使用"postconf sendmail_path"命令可以找出 Postfix sendmail 命令在你机器上的位置。
- 要想知道邮件队列是否被刷新,可以使用以下命令
#!/bin/sh # 开始送信 /usr/sbin/sendmail -q # 允许开始交付。 sleep 10 # 循环播放,直到所有信息都至少尝试过一次。 while mailq | grep '^[^ ]*\*' >/dev/null do sleep 10 done如果你已经禁用了自发的 SMTP 邮件发送功能,你还需要在拨号连接正常时不时运行"sendmail -q"命令,以便将新寄出的邮件从队列中清除。
在没有真正 Internet 主机名的主机上使用 Postfix
本节适用于没有自己 Internet 主机名的主机。 这些系统通常通过 DHCP 或拨号获得动态 IP 地址。 Postfix 可以让您在使用幻想名称的机器上的账户之间正常收发邮件。 但是,在向互联网发送邮件时,您不能在邮件地址中使用虚构的主机名,因为没有人会回复您的邮件。 事实上,越来越多的网站拒绝接收域名不存在的邮件地址。
注意:以下信息与 Postfix 版本有关。 要了解 Postfix 的版本,请执行命令"postconf mail_version"。
解决方案 1: Postfix 2.2 及更高版本
Postfix 2.2 使用generic(5)地址映射,将本地幻想电子邮件地址替换为有效的互联网地址。 这种映射只在邮件离开机器时发生,而不是在同一台机器上的用户之间发送邮件时发生。
下面的示例介绍了附加配置。 您需要将其与本文前半部分讨论的基本配置信息结合起来。
1 /etc/postfix/main.cf: 2 smtp_generic_maps = hash:/etc/postfix/generic 3 4 /etc/postfix/generic: 5 [email protected] [email protected] 6 [email protected] [email protected] 7 @localdomain.local [email protected]
通过 SMTP 向远程主机发送邮件时:
- 第 5 行将[email protected]替换为他的 ISP 邮件地址、
- 第 6 行用她的 ISP 邮件地址替换[email protected],以及
- 第 7 行用他的 ISP 账户替换其他本地地址,地址扩展名为+local(本例假定 ISP 支持 "+"式地址扩展)。
如果系统使用dbm文件而不是db文件,请指定dbm而不是hash。 要了解 Postfix 支持哪些查找表,请使用"postconf -m"命令。
每当更改通用表时,执行命令"postmap /etc/postfix/generic"。
解决方案 2: Postfix 2.1 及更早版本
旧版 Postfix 系统的解决方案是尽可能使用有效的互联网地址,并让 Postfix 将有效的互联网地址映射到本地奇幻城娱乐地址。 这样,您就可以向互联网和本地幻想地址发送邮件,包括向本身没有有效互联网地址的本地幻想地址发送邮件。
下面的示例介绍了附加配置。 您需要将其与本文前半部分讨论的基本配置信息结合起来。
1 /etc/postfix/main.cf: 2 myhostname = hostname.localdomain 3 mydomain = localdomain 4 5 canonical_maps = hash:/etc/postfix/canonical 6 7 virtual_alias_maps = hash:/etc/postfix/virtual 8 9 /etc/postfix/canonical: 10 your-login-name [email protected] 11 12 /etc/postfix/virtual: 13 [email protected] your-login-name
翻译:
- 第 2-3 行:在此处替换您幻想中的主机名。 不要使用互联网上真实组织已经在使用的域名。 请参见RFC 2606,了解保证不为任何人所有的域名示例。
- 第 5、9、10 行:提供从 "[email protected] "到 "[email protected] "的映射。 这部分是必需的。
- 第 7、12、13 行:在本地为 "[email protected] "发送邮件,而不是发送到 ISP。 这部分不是必需的,但很方便。
如果系统使用的是dbm文件而不是db文件,请指定dbm而不是hash。 要了解 Postfix 支持哪些查找表,请使用"postconf -m"命令。
更改规范表时,执行"postmap /etc/postfix/canonical" 命令。
更改虚拟表时,执行"postmap /etc/postfix/virtual" 命令。