《UNIX/Linux系统管理技术手册-读书笔记-第十八章
电子邮件
1. 邮件系统架构
| 组件 |
说明 |
能做什么 |
| MUA(用户代理) |
用户读写邮件的客户端(Thunderbird、Outlook、/bin/mail) |
收发邮件、管理文件夹 |
| MSA(邮件提交代理) |
从MUA接收邮件并提交给MTA,端口587 |
分离提交与传输,支持认证和加密 |
| MTA(邮件传输代理) |
在机器间路由邮件,端口25 |
接收、中继、转发邮件到目的地 |
| DA(投递代理) |
将邮件放入本地消息存储(如procmail、maildrop) |
本地投递、过滤、分类 |
| AA(访问代理) |
提供IMAP/POP3访问 |
用户从多设备读取邮件 |
| 消息存储 |
mbox(单文件)或Maildir(每消息一文件) |
保存用户邮件数据 |
邮件投递流程:MUA → MSA → MTA →(Internet)→ MTA → DA → 消息存储 → AA → MUA
现代趋势:很多组织使用云托管邮件(Gmail、Office 365),但管理员仍需理解底层原理以支持排错和集成。
2. 邮件消息解剖
2.1 三部分结构
| 部分 |
说明 |
可见性 |
| 信封 |
发件方/收件方地址(由MTA内部使用) |
用户不可见 |
| 头部 |
日期、From、To、Received、Subject等 |
用户代理可显示 |
| 主体 |
消息内容(可含MIME编码的附件) |
用户可见 |
2.2 阅读邮件头部(排错关键)
1
2
3
4
5
6
7
|
# 从Received行自底向上阅读,跟踪邮件路径
Received: from mail- relay.atrust.com [63.173.189.2] by mx.google.com
Received: from mail.schweikert.ch [88.198.52.145] by mail- relay.atrust.com
Received: by mail.schweikert.ch (Postfix)
Date: Fri, 24 May 2013 17:14:06 +0200
From: David Schweikert <[email protected]>
To: [email protected]
|
关键头部字段:
Received: 记录每跳路径(自底向上阅读)
Return-Path: 信封发件方(用于回弹)
SPF / Authentication-Results:反垃圾邮件验证结果
3. SMTP协议
3.1 常用SMTP命令
| 命令 |
功能 |
说明 |
EHLO hostname |
标识客户端(ESMTP) |
优先使用,可协商扩展 |
HELO hostname |
标识客户端(SMTP) |
备选 |
MAIL FROM: addr |
指定信封发件方 |
每则消息一次 |
RCPT TO: addr |
指定收件方 |
可多次出现 |
DATA |
开始传输邮件主体 |
以单行.结束 |
QUIT |
关闭连接 |
|
VRFY addr |
验证地址是否有效 |
安全考虑常被禁用 |
EXPN addr |
显示别名扩展 |
安全考虑常被禁用 |
3.2 SMTP错误码
| 首位数字 |
含义 |
| 2xx |
成功 |
| 4xx |
临时错误(可重试) |
| 5xx |
永久错误(不可重试) |
常用DSN代码(RFC3463):
| 代码 |
含义 |
| 4.2.2 / 5.2.2 |
邮箱已满 |
| 4.4.1 / 5.4.1 |
主机无响应 |
| 5.1.1 |
用户不存在 |
| 5.7.1 |
邮件被拒绝(策略) |
3.3 SMTP认证(EHLO响应中AUTH行)
1
2
3
4
5
|
# 手动测试SMTP服务器
telnet mail.example.com 25
EHLO client.example.com
AUTH LOGIN
...
|
常见机制:PLAIN、LOGIN、CRAM-MD5、GSSAPI(Kerberos)
未加密的PLAIN/LOGIN会明文传输密码,需配合TLS/STARTTLS使用。
4. 垃圾邮件与恶意软件
4.1 反垃圾邮件技术
| 技术 |
说明 |
能做什么 |
| SPF(发送方策略框架) |
DNS TXT记录列出授权发件服务器 |
验证邮件来源,防止伪造 |
| DKIM(域密钥识别邮件) |
使用加密签名认证邮件来源和完整性 |
检测邮件是否被篡改 |
| DMARC |
SPF+DKIM的策略框架 |
告诉接收方如何处理验证失败的邮件 |
| DNS黑名单(DNSBL) |
查询已知垃圾邮件发送者IP |
在MTA层面拒绝 |
| 内容过滤 |
扫描邮件正文/附件 |
检测病毒、钓鱼链接 |
SPF记录示例(DNS TXT记录):v=spf1 mx include:_spf.google.com ~all
4.2 统计现状
- 全部邮件中 95%–98% 是垃圾邮件
- 反垃圾邮件首选云服务(如McAfee SaaS、Google G Suite、Barracuda),不建议自建
4.3 加密与隐私
| 技术 |
适用层 |
说明 |
| TLS/STARTTLS |
MTA间传输 |
加密邮件在传输途中的内容 |
| IMAPS / POP3S |
MUA–AA通道 |
加密用户密码和数据 |
| PGP / GPG / S/MIME |
端到端加密 |
邮件内容从发送方到接收方全程加密 |
5. 邮件别名
5.1 aliases文件(/etc/aliases 或 /etc/mail/aliases)
格式:local-name: recipient1, recipient2, ...
常见别名:
# 必需别名
postmaster: root
mailer-daemon: postmaster
# 系统账户转发
root: [email protected]
bin: /dev/null
# 邮件列表
sa-book: evi, trent, ben
owner-sa-book: evi # 回弹发给列表所有者
别名目标类型:
| 目标格式 |
含义 |
user@domain |
转发到外部地址 |
| ` |
/path/to/command` |
/path/to/file |
追加到文件(安全风险!) |
:include:/path/to/file |
从文件读取地址列表 |
5.2 .forward文件(用户级)
- 位于用户主目录
~/.forward
- 可转发邮件到其他地址或执行简单过滤
- 递归处理:别名可指向其他别名
5.3 别名数据库
1
2
|
newaliases # 重建别名散列数据库(sendmail/Postfix)
# Exim自动检测aliases文件改动
|
6. 主流MTA对比
| MTA |
市场份额(2017) |
特点 |
默认平台 |
| Exim |
56% |
配置灵活、功能强大、学习曲线陡 |
Debian |
| Postfix |
33% |
安全优先、模块化、配置简洁 |
Red Hat、Ubuntu |
| sendmail |
5% |
历史最久、配置晦涩、新部署不推荐 |
FreeBSD |
📈 趋势:sendmail市场份额从2001年60%暴跌至2017年5%,Exim和Postfix已成主流。
7. sendmail核心配置
7.1 配置方式(m4宏预处理器)
.mc文件(人类可读) → m4 → .cf文件(机器解析)
配置目录位置:
| 系统 |
目录 |
| Ubuntu/Debian |
/usr/share/sendmail |
| Red Hat/CentOS |
/etc/mail |
| FreeBSD |
/etc/mail |
7.2 关键m4宏
| 宏/特性 |
功能 |
OSTYPE('linux') |
包含操作系统特定设置 |
MAILER('local')、MAILER('smtp') |
启用投递代理 |
FEATURE('use_cw_file') |
从/etc/mail/local-host-names读取本地主机 |
FEATURE('access_db') |
访问控制数据库(中继、黑名单) |
FEATURE('virtusertable') |
虚拟域别名 |
MASQUERADE_AS('domain') |
所有邮件伪装成来自domain |
SMART_HOST |
传出邮件转发到智能主机 |
MAIL_HUB |
传入邮件转发到邮件枢纽 |
客户端最小配置(空客户端) :
VERSIONID('...')
OSTYPE('linux')
FEATURE('nullclient', 'mailserver')
EXPOSED_USER('root')
7.3 访问数据库(/etc/mail/access)
localhost RELAY
192.168.1.0/24 RELAY
spammer.com REJECT
61.23.45.* ERROR:550 We don't accept mail from spammers
1
|
makemap hash /etc/mail/access < /etc/mail/access # 编译
|
7.4 常用命令
| 命令 |
功能 |
sendmail -bd -q30m |
守护进程模式启动 |
sendmail -bt |
地址测试模式 |
newaliases |
重建别名数据库 |
mailq |
查看邮件队列 |
kill -HUP <sendmail-pid> |
重载配置 |
8. Exim核心配置
配置区顺序(必须!):
- 全局选项(强制)
begin acl(访问控制列表)
begin authenticators(SMTP认证)
begin routers(路由工具)
begin transports(传输工具)
begin retry(重试策略)
begin rewrite(地址重写)
8.2 路由工具类型
| 路由工具 |
功能 |
accept |
接受地址,交给传输工具 |
dnslookup |
查询MX记录发送远程邮件 |
manualroute |
手动指定路由(如智能主机) |
redirect |
重写地址(aliases/forward) |
8.3 传输工具类型
| 传输工具 |
功能 |
appendfile |
投递到文件(本地邮箱) |
smtp |
使用SMTP投递到远程 |
pipe |
管道给外部程序 |
autoreply |
自动回复(如假期通知) |
8.4 常用命令
| 命令 |
功能 |
exim -bd |
守护进程模式 |
exim -bV |
检查配置语法 |
exim -bp |
查看队列(同mailq) |
exim -bt address |
地址测试模式 |
exim -d+expand |
调试模式 |
9. Postfix核心配置
9.1 配置文件
main.cf:主配置(建议只保留非默认值)
master.cf:进程配置(默认即可,修改较少)
9.2 关键参数
| 参数 |
功能 |
mydomain |
本机域名 |
myorigin |
非限定地址追加的域 |
mydestination |
本地投递的域列表 |
relayhost |
传出邮件转发到的智能主机 |
mynetworks |
允许中继的IP范围 |
smtpd_recipient_restrictions |
收件方阶段访问控制 |
9.3 空客户端配置
mydomain = cs.colorado.edu
myorigin = $mydomain
mydestination = # 留空,不接收本地邮件
relayhost = [mail.cs.colorado.edu]
9.4 访问控制(smtpd_recipient_restrictions)
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
| 限制 |
功能 |
permit_mynetworks |
允许mynetworks中的IP中继 |
reject_unauth_destination |
拒绝非本地收件方(防开放中继) |
check_client_access |
查访问表 |
9.5 查找表类型
| 类型 |
说明 |
hash:/path/file |
Berkeley DB散列 |
ldap |
LDAP目录 |
mysql / pgsql |
SQL数据库 |
pcre / regexp |
正则表达式 |
static:value |
总是返回固定值 |
9.6 常用命令
| 命令 |
功能 |
postconf -n |
显示非默认配置 |
postconf -d param |
显示参数默认值 |
postmap hash:/file |
编译查找表 |
postmap -q key hash:/file |
查询表值 |
mailq |
查看队列 |
qshape deferred |
按域汇总队列等待时间 |
postfix reload |
重载配置 |
10. 调试技巧
10.1 检查配置语法
| MTA |
命令 |
| sendmail |
sendmail -bt < /dev/null |
| Exim |
exim -bV |
| Postfix |
postfix check |
10.2 手动SMTP会话(最直接调试法)
10.3 日志位置
| 系统 |
sendmail |
Postfix |
Exim |
| Debian/Ubuntu |
/var/log/mail.log |
/var/log/mail.log |
/var/log/exim_mainlog |
| Red Hat |
/var/log/maillog |
/var/log/maillog |
— |
💡 tail -f /var/log/mail.log 实时监控邮件流量
10.4 常见问题
| 问题 |
可能原因 |
解决方法 |
| 邮件卡在队列 |
目的主机不可达、DNS问题 |
mailq查看,检查DNS |
| 开放中继被利用 |
mydestination/mynetworks配置不当 |
检查reject_unauth_destination |
| 邮件被拒绝(5.7.1) |
SPF/DNSBL黑名单 |
检查IP是否在黑名单 |
| 认证失败 |
SMTP AUTH配置错误 |
检查/etc/sasl2/配置 |
| 发件地址被伪造 |
无SPF/DKIM |
配置SPF和DKIM |
11. 本章核心命令速查表
| 命令 |
功能 |
MTA |
newaliases |
重建别名数据库 |
sendmail/Postfix |
mailq |
查看邮件队列 |
全平台 |
sendmail -bt |
sendmail地址测试 |
sendmail |
exim -bV |
Exim配置语法检查 |
Exim |
exim -bp |
Exim队列查看 |
Exim |
postconf -n |
Postfix非默认配置显示 |
Postfix |
postmap hash:/file |
Postfix查找表编译 |
Postfix |
postfix reload |
Postfix重载配置 |
Postfix |
qshape deferred |
Postfix队列按域汇总 |
Postfix |
telnet server 25 |
手动SMTP测试 |
全平台 |
DBA视角补充:
- 监控告警邮件:数据库监控工具(如Nagios、Zabbix)和cron作业的告警通常通过本地MTA发送邮件。确保本地MTA(常为Postfix)正确配置了
relayhost指向企业邮件网关,否则告警邮件可能无法送达或被标记为垃圾邮件。
- 邮件认证与SPF/DKIM:若数据库服务器需要发送邮件(如报表),确保其IP已加入SPF记录,避免被接收方拒收。
- 日志分析:数据库故障排查时,邮件队列积压(
mailq)可能暗示网络问题或邮件服务器故障。/var/log/mail.log中的connection timed out可指示网络连接问题。
- 安全考虑:避免在数据库服务器上运行任何
|/path/to/command类型的邮件别名,防止邮件被用于执行任意命令。使用smrsh等受限shell。