《UNIX/Linux系统管理技术手册-读书笔记-第十八章

电子邮件

1. 邮件系统架构

组件 说明 能做什么
MUA(用户代理) 用户读写邮件的客户端(Thunderbird、Outlook、/bin/mail 收发邮件、管理文件夹
MSA(邮件提交代理) 从MUA接收邮件并提交给MTA,端口587 分离提交与传输,支持认证和加密
MTA(邮件传输代理) 在机器间路由邮件,端口25 接收、中继、转发邮件到目的地
DA(投递代理) 将邮件放入本地消息存储(如procmailmaildrop 本地投递、过滤、分类
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核心配置

8.1 配置文件(/usr/exim/configure

配置区顺序(必须!):

  1. 全局选项(强制)
  2. begin acl(访问控制列表)
  3. begin authenticators(SMTP认证)
  4. begin routers(路由工具)
  5. begin transports(传输工具)
  6. begin retry(重试策略)
  7. 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会话(最直接调试法)

1
2
3
4
5
6
7
8
9
telnet mail.example.com 25
EHLO client.example.com
MAIL FROM: <[email protected]>
RCPT TO: <[email protected]>
DATA
Subject: Test
This is a test.
.
QUIT

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。