在 Ubuntu 上安装和配置 Postfix 是一个相对直接的过程。Postfix 是一个强大的、配置灵活的邮件传输代理 (MTA),常用于发送和接收电子邮件。
以下是详细的步骤,包括安装、基本配置以及一些常见的高级配置选项:
—
1. 更新包列表
在安装任何新软件之前,最好先更新你的包列表,以确保你安装的是最新版本。
bash
sudo apt update
2. 安装 Postfix
使用 apt 命令安装 Postfix。在安装过程中,你可能会被要求进行一些基本的配置。
bash
sudo apt install postfix
安装过程中的配置选项:
* General type of mail configuration:
* No configuration: 如果你只需要 Postfix 作为一个简单的本地邮件发送器,或者希望手动配置一切。
* Internet Site: 这是最常见的选项,用于将你的服务器配置为可以发送和接收互联网上的电子邮件。
* Internet with smarthost: 用于将所有出站邮件发送到一个指定的外部 SMTP 服务器(smarthost)。
* Satellite system: 类似于 smarthost,但更侧重于只发送邮件,并且可能没有自己的域名。
* Local only: 仅用于发送本地用户的邮件,不连接到外部网络。
推荐选择:Internet Site(如果你希望服务器直接发送和接收互联网邮件)。
* System mail name:
这是你的服务器将被识别的域名。通常,这应该是你的完全限定域名 (FQDN),例如 mail.yourdomain.com 或 yourdomain.com。
* 示例: 如果你的域名是 example.com,并且你希望你的邮件显示为 user@example.com,那么这里应该输入 example.com。
* Root and postmaster mail recipient (Optional):
此字段允许你指定一个本地用户,所有发送给 root 和 postmaster 别名的邮件都将转发到该用户。通常,你可以保持此字段为空,让这些邮件发送到你的主用户账户,或者指定一个特定的用户。
* Other Postfix configuration:
在安装完 postfix 包后,它会执行一些默认配置。如果你选择 Internet Site,Postfix 会尝试配置为直接发送和接收邮件。
—
Postfix 的主配置文件是 /etc/postfix/main.cf。另一个重要的文件是 /etc/postfix/master.cf,它定义了 Postfix 的守护进程。
在进行任何修改之前,最好备份当前的配置文件:bash
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
你可以使用文本编辑器(如 nano 或 vim)打开和编辑 main.cf:bash
sudo nano /etc/postfix/main.cf
main.cf)
以下是一些在 main.cf 中最常需要配置的参数:
* myhostname:
你的服务器的主机名。通常应该是你的 FQDN。
myhostname = mail.yourdomain.com
* mydomain:
你的服务器所属的域名。
mydomain = yourdomain.com
* myorigin:
用于决定发送邮件的来源域名。
* 如果设置为 $mydomain,则从你的服务器发送的邮件看起来像是来自 user@yourdomain.com。
* 如果设置为 $myhostname,则看起来像是来自 user@mail.yourdomain.com。
* 通常,$mydomain 是一个好选择。
myorigin = $mydomain
* inet_interfaces:
指定 Postfix 监听的网络接口。
* all: 监听所有网络接口(推荐用于服务器)。
* localhost: 仅监听本地回环接口(仅用于发送本地邮件)。
* 127.0.0.0/8: 仅监听 IPv4 回环接口。
* [::1]: 仅监听 IPv6 回环接口。
* your_ip_address: 监听指定的 IP 地址。
inet_interfaces = all
* mydestination:
指定 Postfix 认为它自己应该接收的邮件的域名列表。
* $myhostname:你服务器的 FQDN。
* $mydomain:你的域名。
* localhost.$mydomain:本地域名。
* localhost: 本地主机名。
* 示例 (对于 Internet Site):
mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost
如果你的 FQDN 是 mail.example.com 且你的域名是 example.com,这会使 Postfix 接收发往 user@mail.example.com 和 user@example.com 的邮件。
* mynetworks:
定义了 Postfix 信任的网络列表,这些网络中的主机可以通过 Postfix 发送邮件而不经过认证。
* 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128: 这是默认值,表示只信任本地主机。
* 如果你需要从本地网络发送邮件,需要添加你的本地网络 IP 地址范围。
* 注意: 谨慎添加 IP 地址范围,否则可能将你的服务器变成一个开放的中继。
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
* relayhost:
如果你配置为 Internet with smarthost 或 Satellite system,这里指定你的 smarthost。
* 通常留空,除非你确实需要使用 smarthost。
#relayhost =
* home_mailbox:
指定本地用户的邮件存储位置。
* Maildir/: 将邮件存储在用户主目录下的 Maildir 目录中(推荐,它能更好地处理多线程和并发访问)。
* mbox: 将邮件存储在用户主目录下的 mbox 文件(例如 /var/mail/username)。
home_mailbox = Maildir/
为了加密电子邮件传输,你需要配置 TLS/SSL。
* 生成或获取 SSL 证书:
你可以生成自签名证书(仅用于测试或内部使用)或从 Let’s Encrypt 等 CA 获取免费证书。
* Let’s Encrypt:
1. 安装 Certbot: sudo apt install certbot
2. 获取证书: sudo certbot certonly --standalone -d mail.yourdomain.com (替换 mail.yourdomain.com 为你的域名)
3. 证书通常位于 /etc/letsencrypt/live/mail.yourdomain.com/。
* 在 main.cf 中配置 TLS:
bash
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem # 自签名证书路径,请替换为你的证书路径
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key # 自签名私钥路径,请替换为你的私钥路径
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# For sending mail out
smtp_tls_security_level = may
smtpd_tls_security_level = may
# For receiving mail in
smtpd_tls_auth_only = yes # 仅在需要认证时使用TLS
重要:
* 将 smtpd_tls_cert_file 和 smtpd_tls_key_file 指向你的实际证书和私钥文件。
* 对于 Let’s Encrypt,它们通常是:
* smtpd_tls_cert_file=/etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem
* smtpd_tls_key_file=/etc/letsencrypt/live/mail.yourdomain.com/privkey.pem
* smtp_tls_security_level = may 和 smtpd_tls_security_level = may 允许 Postfix 在可能的情况下使用 TLS。
* smtpd_tls_auth_only = yes 建议只在进行身份验证时强制使用 TLS,这有助于避免拒绝未加密的连接。
为了允许用户通过你的服务器发送邮件(SMTP 认证),你需要配置 SASL (Simple Authentication and Security Layer)。
* 安装 Cyrus SASL 库:
bash
sudo apt install libsasl2-modules
* 配置 Postfix for SASL:
在 /etc/postfix/main.cf 中添加或修改以下行:
bash
# SASL authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination
* smtpd_sasl_auth_enable = yes: 启用 SASL 认证。
* smtpd_sasl_security_options = noanonymous: 禁止匿名认证。
* smtpd_sasl_local_domain = $myhostname: 设置你的本地 SASL 域名。
* smtpd_recipient_restrictions: 这是非常重要的一个参数,它定义了接收邮件的策略。上面的配置意味着:
1. 允许通过 SASL 认证的用户。
2. 允许来自 mynetworks(你信任的网络)的主机。
3. 拒绝所有其他未被授权的目标。
* 创建 SASL 配置文件:
在 /etc/postfix/sasl/ 目录下创建一个 smtpd.conf 文件:
bash
sudo mkdir -p /etc/postfix/sasl
sudo nano /etc/postfix/sasl/smtpd.conf
添加以下内容:
pwcheck_method: saslauthd
mech_list: plain login
* pwcheck_method: saslauthd: 指定使用 saslauthd 服务进行密码验证。
* mech_list: plain login: 允许 PLAIN 和 LOGIN 认证机制。
* 配置 saslauthd:
saslauthd 用于检查用户的密码是否有效。通常它会与系统用户数据库、LDAP 或其他认证源集成。
* 修改 /etc/default/saslauthd:
bash
sudo nano /etc/default/saslauthd
找到 START=no 并将其改为 START=yes。
找到 MECHANISMS 并确保它包含 pam (如果你的用户是系统用户)。
START=yes
MECHANISMS="pam"
* PAM: 如果你使用系统的用户账户进行认证,pam 机制将允许 saslauthd 使用 PAM (Pluggable Authentication Modules) 来验证密码。
* 启动并启用 saslauthd:
bash
sudo systemctl start saslauthd
sudo systemctl enable saslauthd
Postfix 使用 /etc/aliases 文件来管理用户别名。
* 编辑 aliases 文件:
bash
sudo nano /etc/aliases
示例:
mailer-daemon: postmaster
postmaster: root
root: your_real_email@yourdomain.com # 将root邮件转发到你的邮箱
* 更新别名数据库:
每次修改 /etc/aliases 后,都需要运行以下命令来生成新的数据库文件:
bash
sudo newaliases
* postfwd 或 rspamd:
更高级的垃圾邮件过滤通常需要专门的工具,如 postfwd (一个简单的防火墙) 或更强大的 rspamd。这些工具需要单独安装和配置。
* RBL (Real-time Blackhole Lists):
可以在 main.cf 中配置 Postfix 使用 RBL 来阻止已知的垃圾邮件发送者。
bash
# Example using a common RBL
smtpd_client_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_rbl_client zen.spamhaus.org
注意: RBL 的配置需要小心,以免误判合法邮件。
—
在进行任何配置更改后,都需要重启 Postfix 服务使之生效。bash
sudo systemctl restart postfix
你也可以使用 reload 命令来平滑地重新加载配置,而不中断正在进行的邮件传输:bash
sudo systemctl reload postfix
使用 mail 命令测试发送本地邮件。bash
echo "This is a test email from the command line." | mail -s "Test Email" your_local_username
然后,切换到 your_local_username 用户,查看邮件:bash
sudo su - your_local_username
mail
测试向外部邮箱(如 Gmail, Outlook)发送邮件。bash
echo "This is a test email to an external address." | mail -s "External Test" your_external_email@example.com
检查你的外部邮箱是否收到了邮件,以及邮件头信息。
从外部邮箱向你的服务器域名邮箱发送邮件,然后检查你服务器上的对应用户是否收到了邮件。
* 如果 home_mailbox = Maildir/,邮件会存储在 /home/your_local_username/Maildir/ 目录下,你可以使用 mutt 或 alpine 等邮件客户端查看。
* 如果你配置了 root 别名,请检查你配置的那个实际邮箱。
Postfix 的日志文件对于故障排除至关重要。
* /var/log/mail.log (或 /var/log/syslog,取决于你的系统配置)bash
sudo tail -f /var/log/mail.log
在发送测试邮件时,观察日志输出,查找错误或警告信息。
—
* 防火墙: 确保你的防火墙允许 SMTP (端口 25) 和 Submission (端口 587,用于客户端发送邮件) 的入站连接。如果需要安全的 IMAP/POP3 访问,还需要允许 IMAPS (端口 993) 和 POP3S (端口 995)。
* 使用 UFW:
bash
sudo ufw allow 25/tcp
sudo ufw allow 587/tcp
sudo ufw allow 465/tcp # SMTPS - less common now
sudo ufw enable
* DNS 配置:
* A 记录: 你的邮件服务器主机名(如 mail.yourdomain.com)需要有一个 A 记录指向服务器的 IP 地址。
* MX 记录: 你的域名(yourdomain.com)需要有一个 MX 记录指向你的邮件服务器主机名。这是其他服务器找到你域名的邮件服务器的关键。
* SPF 记录: 在你的 DNS 中添加 SPF (Sender Policy Framework) 记录,以帮助验证发送邮件的来源,减少垃圾邮件。
* 示例 SPF 记录(如果你的服务器 IP 是 192.0.2.1):
yourdomain.com. IN TXT "v=spf1 mx a ip4:192.0.2.1 ~all"
* DKIM 和 DMARC: 为了进一步提高邮件的可信度和反垃圾邮件能力,建议配置 DKIM (DomainKeys Identified Mail) 和 DMARC (Domain-based Message Authentication, Reporting & Conformance)。这通常涉及安装额外的软件(如 opendkim)和配置 DNS 记录。
* 轮询 (Queue) 管理:
Postfix 会将发送失败的邮件放入队列。可以使用 mailq 命令查看队列,并使用 postsuper 命令管理。
* 查看队列: mailq
* 清除队列中的所有邮件: sudo postsuper -d ALL
* 清除队列中的所有僵尸邮件 (aged): sudo postsuper -d 1h (清除1小时以上的)
* SASL 认证问题:
* 确保 saslauthd 正常运行。
* 检查 /var/log/auth.log 获取认证相关的日志。
* 确认 smtpd.conf 配置正确。
—
总结
安装和配置 Postfix 是一个循序渐进的过程。从基本的安装和 main.cf 配置开始,然后逐步添加 TLS、SASL 等高级功能。仔细阅读日志文件是解决问题的关键。对于生产环境,强烈建议配置 DNS 记录(MX, SPF, DKIM, DMARC)以确保邮件的可送达性和安全性。