Sendmail 配置全解析:从基础到高级应用
1. 引言
在邮件系统的搭建与管理中,Sendmail 是一款功能强大且广泛使用的邮件传输代理(MTA)。它的配置涉及多个方面,包括数据库、宏、功能特性等。本文将详细介绍 Sendmail 的配置要点,帮助你更好地理解和运用这款工具。
2. Sendmail 配置基础
2.1 配置文件与目录
不同规模的站点对配置文件的需求不同。小型站点可能只需一个中心节点和叶节点,因此仅需两个版本的配置文件;而大型站点可能需要为收发邮件分别设置独立的中心节点,甚至还需要单独的 POP/IMAP 服务器。无论站点的复杂程度如何,
cf
目录中通常包含一些现成的配置片段,可根据需求进行定制。
2.2 配置命令大小写规则
Sendmail 配置命令区分大小写。预定义宏的名称通常为全大写,如
OSTYPE
;
m4
命令为全小写,如
define
;可配置选项名称通常以小写的
conf
开头,以全大写的变量名结尾,如
confFALLBACK_MX
。宏通常引用名为
../macroname/arg1.m4
的
m4
文件,例如
OSTYPE('linux')
会包含文件
../ostype/linux.m4
。
3. 表格与数据库
3.1 表格与数据库概述
在深入了解具体的配置原语之前,需要先了解表格(有时也称为映射或数据库)。Sendmail 可以使用这些表格进行邮件路由或地址重写,大多数表格与
FEATURE
宏结合使用。
表格是路由、别名、策略或其他信息的缓存(通常是文本文件),可以使用
makemap
命令将其转换为数据库格式,然后作为 Sendmail 各种查找操作的信息源。虽然数据通常以文本文件形式开始,但 Sendmail 表格的数据也可以来自 DNS、NIS、LDAP 或其他来源。使用集中式 IMAP 服务器可以减轻 Sendmail 查找用户的负担,并使一些表格过时。
3.2 支持的数据库库
Sendmail 支持两种数据库库:
-
dbm/ndbm
库:大多数 UNIX 和 Linux 版本的标准库。
- Berkeley DB:更具扩展性的库,支持多种存储方案。如果系统支持或可以安装 Berkeley DB,建议使用它,因为它比
dbm
更快,并且创建的文件更小。
3.3 数据库映射类型
Sendmail 定义了三种数据库映射类型:
-
dbm
:使用可扩展的哈希算法(
dbm/ndbm
)。
-
hash
:使用标准的哈希方案(DB)。
-
btree
:使用 B 树数据结构(DB)。
对于 Sendmail 中的大多数表格应用,默认的
hash
数据库类型是最佳选择。使用
makemap
命令从文本文件构建数据库文件,需要指定数据库类型和输出文件的基本名称。例如:
$ sudo makemap hash /etc/mail/access < /etc/mail/access
这个命令乍一看可能会让人误以为输入文件会被空的输出文件覆盖,但实际上
makemap
会添加适当的后缀,实际输出文件为
/etc/mail/access.db
,不会产生冲突。每次文本文件更改时,都必须使用
makemap
重新构建数据库文件,但不需要向 Sendmail 发送 HUP 信号。
3.4 文本文件注释与匹配规则
从生成映射的文本文件中可以包含注释,注释以
#
开头,直到行尾结束。在大多数情况下,数据库键使用最长可能的匹配。与任何哈希数据结构一样,输入文本文件中条目的顺序并不重要。期望数据库文件作为参数的
FEATURE
默认使用
hash
作为数据库类型,
/etc/mail/tablename.db
作为数据库文件名。
4. 通用宏与功能
4.1 常见配置原语
以下是一些常见的 Sendmail 配置原语及其使用情况和简要描述:
| 原语 | 是否常用 | 描述 |
| — | — | — |
| OSTYPE | 是 | 包含特定于操作系统的路径和邮件程序标志 |
| DOMAIN | 否 | 包含特定于站点的配置详细信息 |
| MAILER | 是 | 启用邮件程序,通常是
smtp
和
local
|
| FEATURE | 可能 | 启用各种 Sendmail 功能 |
| use_cw_file | 是(服务器) | 列出接受邮件的主机 |
| redirect | 可能(服务器) | 当用户迁移时优雅地退回邮件 |
| always_add_domain | 是 | 如果用户代理未提供,使主机名完全限定 |
| access_db | 可能(服务器) | 设置用于中继邮件的主机数据库 |
| virtusertable | 可能(服务器) | 开启域别名(虚拟域) |
| ldap_routing | 可能(服务器) | 使用 LDAP 路由传入邮件 |
| MASQUERADE_AS | 是 | 使所有邮件看起来都来自一个地方 |
| EXPOSED_USER | 是 | 列出不应被伪装的用户 |
| MAIL_HUB | 是(服务器) | 指定传入邮件的邮件服务器 |
| SMART_HOST | 是(客户端) | 指定传出邮件的邮件服务器 |
4.2 OSTYPE 宏
OSTYPE
文件封装了各种特定于供应商的信息,如与邮件相关的文件的预期位置、Sendmail 需要的命令路径、邮件程序标志等。可以在
cf/README
中找到所有可以在
OSTYPE
文件中定义的变量列表。
4.3 DOMAIN 宏
DOMAIN
指令允许在一个地方指定站点范围的通用信息(
cf/domain/filename.m4
),然后使用
DOMAIN('filename')
将其包含在每个主机的配置文件中。
4.4 MAILER 宏
对于要启用的每个传递代理,都必须包含一个
MAILER
宏。可以在
cf/mailers
目录中找到支持的邮件程序的完整列表,但通常只需要
local
、
smtp
,可能还需要
cyrus
。
MAILER
行通常是
.mc
文件中的最后一部分。
4.5 FEATURE 宏
FEATURE
宏通过包含
feature
目录中的
m4
文件来启用大量常见场景(目前有 56 种)。其语法为:
FEATURE(keyword, arg, arg, …)
其中,
keyword
对应于
cf/feature
目录中的
keyword.m4
文件,参数将传递给该文件。一个特性最多可以有九个参数。
4.6 use_cw_file 特性
Sendmail 内部类
w
(因此称为
cw
)包含此主机接受并传递邮件的所有本地主机的名称。此特性指定接受
/etc/mail/local-host-names
中每行列出的主机的邮件。配置行
FEATURE('use_cw_file')
用于启用此特性。客户端机器除非有昵称,否则通常不需要此特性,但传入邮件的中心节点需要。
local-host-names
文件应包括接受电子邮件的任何本地主机和虚拟域,包括备份 MX 记录指向此主机的站点。
如果在站点中添加新主机,必须将其添加到
local-host-names
文件中,并向 Sendmail 发送 HUP 信号以使更改生效。不幸的是,Sendmail 仅在启动时读取此文件。
4.7 redirect 特性
当人员离开组织时,通常会选择转发他们的邮件或将邮件退回给发件人并附带错误信息。
redirect
特性提供了一种更优雅的退回邮件的方式。
例如,如果 Joe Smith 从
oldsite.edu
(登录名
smithj
)毕业并转到
newsite.com
(登录名
joe
),则启用
redirect
特性:
FEATURE('redirect')
并在
oldsite.edu
的
aliases
文件中添加以下行:
smithj: joe@newsite.com.REDIRECT
这将使发往
smithj
的邮件退回给发件人,并附带一条错误消息,建议发件人尝试使用
joe@newsite.com
地址。邮件本身不会自动转发。
4.8 always_add_domain 特性
always_add_domain
特性使所有电子邮件地址完全限定,应该始终使用此特性。
4.9 access_db 特性
access_db
特性控制中继和其他策略问题。通常,驱动此特性的原始数据要么来自 LDAP,要么保存在名为
/etc/mail/access
的文本文件中。如果使用文本文件,必须使用
makemap
命令将其转换为某种索引格式。在配置文件中使用
FEATURE('access_db')
来使用平面文件;对于 LDAP 版本,使用
FEATURE('access_db', 'LDAP')
。
访问数据库的键字段是 IP 网络或域名,可带有可选的标签,如
Connect:
、
To:
或
From:
。值字段指定如何处理消息。最常见的值包括:
-
OK
:接受消息。
-
RELAY
:允许消息中继。
-
REJECT
:以通用错误指示拒绝消息。
-
ERROR:"error code and message"
:以特定消息拒绝消息。
以下是一个示例
/etc/mail/access
文件的片段:
localhost RELAY
127.0.0.1 RELAY
192.168.1.1 RELAY
192.168.1.17 RELAY
66.77.123.1 OK
fax.com OK
61 ERROR:"550 We don't accept mail from spammers"
67.106.63 ERROR:"550 We don't accept mail from spammers"
4.10 virtusertable 特性
virtusertable
特性支持传入邮件的域别名。此特性允许在一台机器上托管多个虚拟域,在网站托管站点中经常使用。表格的键字段可以是电子邮件地址(
user@host.domain
)或域规范(
@domain
)。值字段是本地或外部电子邮件地址。如果键是域,值可以将用户字段作为变量
%1
传递,或将邮件路由到不同的用户。
以下是一些示例:
@appliedtrust.com %1@atrust.com
unix@book.admin.com sa-book-authors@atrust.com
linux@book.admin.com sa-book-authors@atrust.com
webmaster@example.com billy.q.zakowski@colorado.edu
info@testdomain.net ausername@hotmail.com
所有数据映射左侧的主机键必须列在
cw
文件(
/etc/mail/local-host-names
)中,或包含在
VIRTUSER_DOMAIN
列表中。否则,Sendmail 将不知道在本地接受邮件,并会尝试在 Internet 上查找目标主机,从而导致在退回消息中出现“本地配置错误”消息。
4.11 ldap_routing 特性
LDAP(轻量级目录访问协议)可以作为别名、邮件路由信息以及前面所述的通用表格数据的数据源。
cf/README
文件中有关于 LDAP 的详细章节和大量示例。
要以这种方式使用 LDAP,必须在构建 Sendmail 时包含 LDAP 支持。在
.mc
文件中添加以下行:
define('confLDAP_DEFAULT_SPEC', '-h server -b searchbase')
FEATURE('ldap_routing')
LDAPROUTE_DOMAIN('my_domain')
这些行告诉 Sendmail 使用 LDAP 数据库路由发往指定域的传入邮件。
LDAP_DEFAULT_SPEC
选项标识 LDAP 服务器和搜索的 LDAP 基名。LDAP 默认使用端口 389,除非在
define
中添加
-p ldap_port
指定不同的端口。
Sendmail 使用 LDAP 数据库中两个标签的值:
-
mailLocalAddress
:传入邮件的收件人。
-
mailRoutingAddress
:电子邮件应发送到的目的地。
Sendmail 还支持
mailHost
标签,如果存在该标签,则将邮件路由到指定主机的 MX 指定的邮件处理程序。收件人地址仍为
mailRoutingAddress
标签的值。
LDAP 数据库条目支持通配符条目
@domain
,可将发往指定域中任何人的邮件重路由。默认情况下,发往
user@host1.mydomain
的邮件首先会在
user@host1.mydomain
上触发查找。如果查找失败,Sendmail 会尝试
@host1.mydomain
,但不会尝试
user@mydomain
。包含以下行:
LDAPROUTE_EQUIVALENT('host1.mydomain')
将同时尝试
user@mydomain
和
@mydomain
键。此特性允许单个数据库在复杂站点中路由邮件。还可以从文件中获取
LDAPROUTE_EQUIVALENT
子句的条目,其语法为:
LDAPROUTE_EQUIVALENT_FILE('filename')
4.12 伪装特性
电子邮件地址通常由用户名、主机和域组成,但许多站点不希望其主机名在 Internet 上暴露。
MASQUERADE_AS
宏允许指定一个单一身份,让其他机器隐藏在其后。所有邮件看起来都来自指定的机器或域。对于普通用户来说这没问题,但为了调试目的,像
root
这样的系统用户应该排除在伪装之外。
例如:
MASQUERADE_AS('atrust.com')
EXPOSED_USER('root')
EXPOSED_USER('Mailer-Daemon')
这将使邮件看起来来自
user@atrust.com
,除非邮件由
root
或邮件系统发送,在这些情况下,邮件将携带原始主机的名称。
MASQUERADE_AS
只是庞大伪装机制的冰山一角,还有十几种变体和例外情况。
allmasquerade
和
masquerade_envelope
特性(与
MASQUERADE_AS
结合使用)可以隐藏适量的本地信息。具体细节可参考
cf/README
。
4.13 MAIL_HUB 和 SMART_HOST 宏
伪装通过重写邮件头和(可选)信封,使所有邮件看起来都来自单个主机或域。但大多数站点希望所有邮件实际上都来自(或发送到)单个机器,以便控制病毒、垃圾邮件和公司机密的流动。可以通过 DNS 中的 MX 记录、用于传入邮件的
MAIL_HUB
宏和用于传出邮件的
SMART_HOST
宏的组合来实现此控制。
例如,在架构图中,MX 记录将把来自 Internet 的传入电子邮件定向到非军事区(DMZ)中的 MTA。在验证收到的电子邮件是否没有病毒和垃圾邮件,并确认其发往有效的本地用户后,可以使用以下定义将邮件中继到内部路由 MTA 进行传递:
define('MAIL_HUB', 'smtp:routingMTA.mydomain')
同样,客户端机器将其邮件中继到配置中
nullclient
特性指定的
SMART_HOST
。
SMART_HOST
可以过滤病毒和垃圾邮件,以确保来自站点的邮件不会污染 Internet。
SMART_HOST
的语法与
MAIL_HUB
类似,默认传递代理仍然是
relay
。例如:
define('SMART_HOST', 'smtp:outgoingMTA.mydomain')
可以使用同一台机器作为收发邮件的服务器。
SMART_HOST
和
MAIL_HUB
都必须允许中继,前者允许来自域内客户端的中继,后者允许来自 DMZ 中 MTA 的中继。
5. 客户端配置
5.1 nullclient 特性
如果站点遵循邮件系统设计部分所示的范例,大多数机器需要配置为仅提交用户生成的传出邮件而不接收邮件的客户端。Sendmail 的
nullclient
特性非常适合这种情况。它会创建一个配置文件,通过 SMTP 将所有邮件转发到中央中心节点。在
VERSIONID
和
OSTYPE
行之后,整个配置文件可以简单如下:
FEATURE('nocanonify')
FEATURE('nullclient', 'mailserver')
EXPOSED_USER('root')
其中,
mailserver
是中央中心节点的名称。
nocanonify
特性告诉 Sendmail 不要进行 DNS 查找或使用完全限定的域名重写地址,所有这些工作将由
mailserver
主机完成。此特性类似于
SMART_HOST
,并假设客户端将使用
MASQUERADE_AS mailserver
。
EXPOSED_USER
子句使
root
免受伪装,便于调试。
5.2 配置要求
mailserver
机器必须允许来自其
null
客户端的中继。此权限在
access_db
中授予。
null
客户端必须有一个指向
mailserver
的关联 MX 记录,并且必须包含在
mailserver
的
cw
文件(通常是
/etc/mail/local-host-names
)中。这些设置允许
mailserver
接受客户端的邮件。
如果客户端机器上的用户代理可以使用端口 587 提交邮件,Sendmail 应作为 MSA(无
-bd
标志)运行。否则,可以以守护进程模式(
-bd
)运行 Sendmail,但将
DAEMON_OPTIONS
配置选项设置为仅在回环接口上监听连接。
SUSE 在
/etc/mail/linux.nullclient.mc
中提供了一个
null
客户端的示例
.mc
文件。填写邮件服务器的名称,构建
sendmail.cf
文件即可完成配置。
6. 配置选项
6.1 设置配置选项
使用
m4
的
define
命令设置配置文件选项。
cf/README
文件中提供了所有可作为
m4
变量访问的选项(及其默认值)的完整列表。
默认设置适用于对安全性不太偏执且不太关注性能的典型站点。默认设置通过关闭中继、要求地址完全限定以及要求发件人的域解析为 IP 地址来尝试保护免受垃圾邮件的侵害。如果邮件中心节点非常繁忙且为大量邮件列表提供服务,可能需要调整一些性能值。
6.2 基本配置选项
以下是一些可能需要调整的配置选项:
| 选项名称 | 描述(默认值) |
| — | — |
|
资源管理
| |
| MAX_DAEMON_CHILDREN | 最大子进程数(无限制) |
| MAX_MESSAGE_SIZE | 单个消息的最大字节数(无限) |
| MIN_FREE_BLOCKS | 接受邮件所需的最小文件系统空间(100) |
| TO_lots_of_stuff | 各种操作的超时时间(不同) |
|
性能
| |
| DELAY_LA | 减慢传递的负载平均值(0 = 无限制) |
| FALLBACK_MX | 见相关描述(无默认值) |
| FAST_SPLIT | 在对收件人进行排序和拆分到队列时抑制 MX 查找(1 = 是) |
| HOST_STATUS_DIRECTORY | 见相关描述(无默认值) |
| MCI_CACHE_SIZE | 缓存的打开传出 TCP 连接数(2) |
| MCI_CACHE_TIMEOUT | 保持缓存连接打开的时间(5m) |
| MIN_QUEUE_AGE | 作业必须在队列中停留的最短时间;使繁忙机器更好地处理队列(0) |
| QUEUE_LA | 应将邮件排队而非立即传递的负载平均值(8 * CPU 数量) |
| REFUSE_LA | 拒绝邮件的负载平均值(12 * CPU 数量) |
|
安全与垃圾邮件防范
| |
| AUTH_MECHANISMS | Cyrus SASL 的 SMTP 认证机制 |
| CONNECTION_RATE_THROTTLE | 通过限制邮件连接的接受速率来减缓 DOS 攻击(无限制) |
| DONT_BLAME_SENDMAIL | 覆盖 Sendmail 的安全和文件检查;请勿随意更改!(安全) |
| MAX_MIME_HEADER_LENGTH | 设置 MIME 头的最大大小(无限制) |
| MAX_RCPTS_PER_MESSAGE | 减慢垃圾邮件传递;推迟额外的收件人并发送临时错误消息(无限) |
| PRIVACY_FLAGS | 限制 SMTP 给出的信息(authwarnings) |
|
杂项
| |
| DOUBLE_BOUNCE_ADDRESS | 捕获大量垃圾邮件;一些站点使用
/dev/null
,但这可能隐藏严重问题(postmaster) |
| LDAP_DEFAULT_SPEC | LDAP 数据库的映射规范,包括服务器运行的主机和端口(未定义) |
7. 与垃圾邮件相关的特性
7.1 控制垃圾邮件的特性
Sendmail 具有多种特性和配置选项,可帮助控制垃圾邮件和病毒:
-
控制第三方中继规则
:防止外部用户使用邮件服务器向其他外部用户发送邮件。垃圾邮件发送者经常使用中继来掩盖邮件的真实来源,从而避免被 ISP 检测到。
-
访问数据库
:用于过滤收件人地址,类似于电子邮件的防火墙。
-
黑名单
:编目开放中继和已知的垃圾邮件友好站点,Sendmail 可以检查这些列表。
-
节流机制
:当检测到某些不良行为时,可以减慢邮件接受速度。
-
邮件过滤
:通过名为
libmilter
的通用邮件过滤接口进行邮件头检查和输入邮件过滤。它允许对邮件头和内容进行任意扫描,并拒绝符合特定配置文件的邮件。
7.2 结合其他技术
结合灰名单、使用
amavisd-new
进行内容扫描以及新的 DNS 记录进行电子邮件认证等技术,可以更好地对抗垃圾邮件发送者。
8. 中继控制
8.1 中继的定义与规则
Sendmail 接受传入邮件,查看信封地址,决定邮件的去向,然后将其传递给适当的目的地。当传入消息没有本地收件人时,处理该消息的传输代理被称为中继。
只有在访问数据库中标记为
RELAY
的主机或列在
/etc/mail/relay-domains
中的主机才允许提交邮件进行中继。
8.2 合法中继的情况
中继实际上只在以下三种情况下是必要的:
-
作为网关
:当传输代理作为无法以其他方式访问的主机(如笔记本电脑、Windows PC 和虚拟主机)的网关时。在这种情况下,要中继的所有收件人都位于同一域内。
-
作为外部邮件服务器
:当传输代理是其他不太智能的主机的外部邮件服务器时。在这种情况下,所有发件人的主机名或 IP 地址将是本地的(或至少是可枚举的)。
-
作为备份 MX 目的地
:当同意作为另一个站点的备份 MX 目的地时。
8.3 启用中继的特性
虽然 Sendmail 默认关闭中继,但添加了几个特性来重新启用中继,无论是完全启用还是以有限和受控的方式启用:
-
FEATURE('relay_entire_domain')
:仅允许为自己的域进行中继。
-
RELAY_DOMAIN('domain, …')
:添加更多要中继的域。
-
RELAY_DOMAIN_FILE('filename')
:从文件中获取要中继的域列表。
-
FEATURE('relay_hosts_only')
:影响
RELAY_DOMAIN
和
accessdb
。
如果使用
SMART_HOST
或
MAIL_HUB
指定通过特定邮件服务器路由邮件,则该服务器必须配置为允许从本地主机进行中继,可以使用
FEATURE('relay_entire_domain')
进行配置。
8.4 注意事项
在考虑以某种形式启用中继时,务必查阅 Sendmail 文档,确保不会无意中成为垃圾邮件发送者的朋友。完成配置后,使用中继检查站点验证是否无意中创建了开放中继,例如
spamhelp.org
。
9. 用户或站点黑名单
9.1 本地黑名单
如果要阻止发往本地用户或主机的邮件,可以使用
FEATURE('blacklist_recipients')
。此特性支持在访问文件中使用以下类型的条目:
To:nobody@ ERROR:550 Mailbox disabled for this user
To:printer.mydomain ERROR:550 This host does not accept mail
To:user@host.mydomain ERROR:550 Mailbox disabled for this user
这些行阻止发往任何主机上的
nobody
用户、
printer
主机以及特定机器上特定用户地址的传入邮件。使用
To:
标签允许这些用户发送消息,但不接收消息,某些打印机具有此功能。
9.2 DNS 黑名单
要包含传入电子邮件的 DNS 风格黑名单,可以使用
dnsbl
特性:
FEATURE('dnsbl', 'zen.spamhaus.org')
此特性使 Sendmail 拒绝来自
spamhaus.org
维护的三个已知垃圾邮件发送者黑名单(SBL、XBL 和 PBL)中任何 IP 地址的邮件。其他列表编目运行开放中继的站点和可能是垃圾邮件发送者避风港的已知地址块。这些黑名单通过 DNS 系统的巧妙调整进行分发,因此称为
dnsbl
。
可以向
dnsbl
特性传递第三个参数,以指定希望返回的错误消息。如果省略此参数,Sendmail 将返回包含记录的 DNS 数据库中的固定错误消息。可以多次包含
dnsbl
特性以检查不同的滥用者列表。
10. 节流、速率和连接限制
10.1 控制邮件处理速度的原语
以下是一些可以在客户端行为可疑时减慢邮件处理速度的 Sendmail 控制原语:
| 原语 | 描述 |
| — | — |
| BAD_RCPT_THROTTLE | 减慢垃圾邮件发送者收集地址的速度 |
| MAX_RCPTS_PER_MESSAGE | 如果消息有太多收件人,则推迟传递 |
| ratecontrol 特性 | 限制传入连接的速率 |
| conncontrol 特性 | 限制同时连接的数量 |
| greet_pause 特性 | 延迟 HELO 响应,要求严格遵守 SMTP 协议 |
10.2 具体配置与效果
-
BAD_RCPT_THROTTLE
:当不存在的登录计数达到
BAD_RCPT_THROTTLE选项中设置的限制时,Sendmail 在每个被拒绝的RCPT命令后休眠一秒钟,从而将垃圾邮件发送者的地址收集速度减慢到几乎停滞。例如,将阈值设置为 3:
define('confBAD_RCPT_THROTTLE', '3')
- MAX_RCPTS_PER_MESSAGE :设置此选项会使发送者将额外的收件人排队等待稍后处理,这是一种针对收件人数量可疑的消息的廉价灰名单形式。
-
ratecontrol 和 conncontrol 特性
:允许按主机或网络限制传入连接的接受速率和同时连接的数量。两者都使用
/etc/mail/access文件来指定限制和应用这些限制的域,前者在键字段中使用ClientRate:标签,后者使用ClientConn:标签。要启用速率控制,在.mc文件中插入以下行:
FEATURE('ratecontrol', 'nodelay','terminate')
FEATURE('conncontrol', 'nodelay','terminate')
然后,在
/etc/mail/access
文件中添加要控制的主机或网络列表及其限制阈值。例如:
ClientRate:192.168.6.17 2
ClientRate:170.65.3.4 10
ClientConn:192.168.2.8 2
ClientConn:175.14.4.1 7
ClientConn: 10
这些行分别将主机
192.168.6.17
和
170.65.3.4
的新连接速率限制为每分钟 2 个和 10 个;将
192.168.2.8
的同时连接数限制为 2 个,
175.14.4.1
的同时连接数限制为 7 个,其他所有主机的同时连接数限制为 10 个。
-
greet_pause 特性
:当远程 MTA 连接到 Sendmail 服务器时,SMTP 协议要求它在发送消息之前等待服务器的欢迎问候。然而,垃圾邮件发送者经常立即发送
EHLO/HELO
命令,这种行为被称为“猛击”,是可疑的。
greet_pause
特性使 Sendmail 在连接开始时等待指定的时间再向新连接的 MTA 发送问候。如果远程 MTA 不等待正确的问候并在计划的延迟期间发送
EHLO
或
HELO
命令,Sendmail 将记录错误并拒绝来自该远程 MTA 的后续命令。可以在
.mc
文件中使用以下条目启用问候延迟:
FEATURE('greet_pause', '700')
这将在每个新连接开始时导致 700 毫秒的延迟。可以在访问数据库中使用
GreetPause:
前缀设置按主机或网络的延迟,但大多数站点对此特性使用统一值。
11. Milter 配置
11.1 Milter 概述与配置指令
Miltering 是一种通用的邮件过滤机制,在 Sendmail 中,配置指令
INPUT_MAIL_FILTER
和
MAIL_FILTER
控制 Milter 操作。一系列选项允许对每个过滤器在 SMTP 对话中的确切应用时间进行细粒度控制(
MILTER_MACROS_*
)。
例如,以下行将每个传入消息通过指定的套接字传递给
/etc/mail/filtername
程序:
INPUT_MAIL_FILTER('filtername', 'S=mailer:/var/run/filtername.socket')
11.2 实际配置示例
以下是一个更实际的示例,使用 Milter 连接到 SpamAssassin 通过本地域套接字,并使用
dkim-filter
程序通过 TCP 套接字在端口 8699 检查 DKIM 签名:
dnl # Enable SpamAssassin
INPUT_MAIL_FILTER('spamassassin',
'S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
dnl # Enable DomainKeys and DKIM
INPUT_MAIL_FILTER('dkim-filter', 'S=inet:8699@127.0.0.1, T=R:2m')
define('confMILTER_MACROS_CONNECT', 'j, {daemon_name}')
define('confMILTER_MACROS_ENVFROM', 'i, {auth_type}')
最后两条语句分别设置在会话连接开始时和
MAIL FROM
命令之后传递给 Milter 的参数。
11.3 更多信息
有关更多信息,请参阅
libmilter/README
或 Sendmail 发行版的
libmilter/docs
目录中的 HTML 文档。
README
文件提供了概述和一个将消息记录到文件的简单过滤器示例,
docs
目录中的文件描述了库接口并说明了如何使用各种调用来构建自己的邮件过滤程序。
milter.org
是一个很好的参考资源。
12. amavisd 与 Sendmail 连接
12.1 amavisd 简介
amavisd 是一个外部的、工业强度的病毒和垃圾邮件扫描器。
12.2 连接方式
连接 Sendmail 和 amavisd 的最简单方法是使用两个邮件服务器:一个从 Internet 接收邮件并将其传递给 amavisd;另一个以仅队列模式运行,接收 amavisd 扫描后的消息,并将其继续传递,无论是进行本地传递还是发送到 Internet。amavisd 位于两者之间。
通过以上对 Sendmail 配置的详细介绍,你可以根据自己的需求和站点特点,灵活运用各种配置选项和特性,构建一个安全、高效的邮件系统。在实际配置过程中,要仔细测试和调整,确保系统的稳定性和可靠性。
13. 配置流程总结
为了更清晰地展示 Sendmail 的配置过程,我们可以将上述配置步骤整理成如下流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始配置]):::startend --> B(选择合适的 OSTYPE):::process
B --> C(确定 DOMAIN 信息):::process
C --> D(启用必要的 MAILER):::process
D --> E{是否需要特定 FEATURE?}:::decision
E -->|是| F(启用相应 FEATURE):::process
E -->|否| G(设置邮件路由相关宏):::process
F --> G
G --> H(设置客户端配置):::process
H --> I(调整配置选项):::process
I --> J(设置与垃圾邮件相关特性):::process
J --> K(配置中继控制):::process
K --> L(设置用户或站点黑名单):::process
L --> M(设置节流、速率和连接限制):::process
M --> N(配置 Milter):::process
N --> O(连接 amavisd):::process
O --> P([完成配置]):::startend
这个流程图展示了从开始配置到完成的主要步骤。在实际操作中,可以根据具体需求和站点情况,对每个步骤进行详细设置和调整。
14. 配置示例分析
下面我们通过一个具体的配置示例,来进一步说明如何综合运用上述各种配置选项和特性。
14.1 示例场景
假设我们有一个小型企业站点,需要搭建一个邮件系统,满足以下需求:
- 接受来自特定域名的邮件,并进行本地投递。
- 防止垃圾邮件和病毒的入侵。
- 控制邮件的中继,确保只有内部主机可以进行中继。
- 对邮件进行过滤,检查 DKIM 签名。
14.2 配置步骤
14.2.1 基本配置
首先,我们需要选择合适的
OSTYPE
,并包含必要的
MAILER
:
OSTYPE(`linux')
MAILER(`local')
MAILER(`smtp')
14.2.2 启用特性
启用一些必要的特性,如
use_cw_file
、
always_add_domain
和
access_db
:
FEATURE(`use_cw_file')
FEATURE(`always_add_domain')
FEATURE(`access_db')
14.2.3 配置邮件路由
设置
MAIL_HUB
和
SMART_HOST
,确保邮件可以正确路由:
define(`MAIL_HUB', `smtp:routingMTA.mydomain')
define(`SMART_HOST', `smtp:outgoingMTA.mydomain')
14.2.4 配置访问数据库
在
/etc/mail/access
文件中配置允许中继的主机和 IP 地址:
localhost RELAY
127.0.0.1 RELAY
192.168.1.0/24 RELAY
然后使用
makemap
命令将其转换为数据库文件:
$ sudo makemap hash /etc/mail/access < /etc/mail/access
14.2.5 配置垃圾邮件防范
启用
dnsbl
特性,使用
zen.spamhaus.org
黑名单:
FEATURE(`dnsbl', `zen.spamhaus.org')
14.2.6 配置 Milter
使用 Milter 连接到 SpamAssassin 和
dkim-filter
:
dnl # Enable SpamAssassin
INPUT_MAIL_FILTER(`spamassassin',
`S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
dnl # Enable DomainKeys and DKIM
INPUT_MAIL_FILTER(`dkim-filter', `S=inet:8699@127.0.0.1, T=R:2m')
define(`confMILTER_MACROS_CONNECT', `j, {daemon_name}')
define(`confMILTER_MACROS_ENVFROM', `i, {auth_type}')
14.2.7 配置 amavisd
使用两个邮件服务器连接 Sendmail 和 amavisd:
- 一个邮件服务器从 Internet 接收邮件并传递给 amavisd。
- 另一个邮件服务器以仅队列模式运行,接收 amavisd 扫描后的消息并继续传递。
14.3 配置验证
完成上述配置后,需要对邮件系统进行验证,确保其正常工作:
- 发送测试邮件,检查邮件是否可以正常接收和发送。
- 模拟垃圾邮件和病毒邮件,检查系统是否可以正确拦截。
- 检查日志文件,查看是否有异常信息。
15. 常见问题与解决方案
在配置和使用 Sendmail 过程中,可能会遇到一些常见问题,下面我们将对这些问题进行总结,并给出相应的解决方案。
15.1 邮件无法接收
问题描述
邮件无法被 Sendmail 接收,可能是由于配置错误、网络问题或权限问题导致的。
解决方案
-
检查
use_cw_file特性是否正确配置,确保local-host-names文件中包含了接受邮件的主机和域名。 - 检查网络连接,确保 Sendmail 服务器可以正常访问 Internet。
- 检查文件和目录的权限,确保 Sendmail 有足够的权限读取和写入相关文件。
15.2 邮件被误判为垃圾邮件
问题描述
正常的邮件被 Sendmail 误判为垃圾邮件,并被拦截。
解决方案
-
检查
dnsbl特性的配置,确保黑名单的使用不会误判正常邮件。 - 调整 Milter 的配置,优化邮件过滤规则。
- 查看邮件日志,分析误判的原因,并进行相应的调整。
15.3 中继问题
问题描述
邮件无法进行中继,或者中继过程中出现错误。
解决方案
-
检查
access_db特性的配置,确保允许中继的主机和 IP 地址正确设置。 -
检查
MAIL_HUB和SMART_HOST的配置,确保邮件可以正确路由。 - 查看日志文件,分析中继错误的原因,并进行相应的调整。
16. 性能优化建议
为了提高 Sendmail 的性能,我们可以采取以下优化建议:
16.1 资源管理
-
调整
MAX_DAEMON_CHILDREN:根据服务器的性能和负载情况,合理调整最大子进程数,避免过多的子进程导致系统资源耗尽。 -
设置
MAX_MESSAGE_SIZE:限制单个邮件的最大大小,防止大邮件占用过多的系统资源。 -
调整
MIN_FREE_BLOCKS:确保文件系统有足够的空间来接受邮件,避免因磁盘空间不足而导致邮件接收失败。
16.2 性能参数
-
调整
DELAY_LA和QUEUE_LA:根据服务器的负载情况,合理调整延迟传递和队列的负载平均值,确保邮件在高负载时可以正常处理。 -
优化
FAST_SPLIT和MCI_CACHE_SIZE:启用FAST_SPLIT可以抑制 MX 查找,提高收件人排序和拆分的效率;调整MCI_CACHE_SIZE可以缓存更多的传出 TCP 连接,减少连接建立的时间。
16.3 安全与垃圾邮件防范
-
优化
AUTH_MECHANISMS:选择安全的 SMTP 认证机制,避免使用明文传输密码的机制。 -
调整
CONNECTION_RATE_THROTTLE和MAX_RCPTS_PER_MESSAGE:限制邮件连接的接受速率和每个消息的最大收件人数,防止垃圾邮件和 DOS 攻击。
17. 总结
Sendmail 是一款功能强大的邮件传输代理,其配置涉及多个方面,包括数据库、宏、功能特性等。通过本文的详细介绍,我们了解了 Sendmail 的基本配置方法、与垃圾邮件相关的特性、中继控制、用户或站点黑名单、节流和连接限制等内容。同时,我们还通过配置示例分析、常见问题解决方案和性能优化建议,进一步加深了对 Sendmail 配置和使用的理解。
在实际应用中,我们需要根据具体需求和站点情况,灵活运用各种配置选项和特性,构建一个安全、高效的邮件系统。同时,要定期检查和维护邮件系统,及时处理出现的问题,确保系统的稳定性和可靠性。希望本文对你配置和使用 Sendmail 有所帮助。
超级会员免费看
7

被折叠的 条评论
为什么被折叠?



