首页 > 技术文章 > linux搭建邮件服务器 - postifx + SSL + 465端口配置

wangbingbing 2021-10-18 11:40 原文

整体参考:https://www.cnblogs.com/chris-cp/p/4843407.html
建议先看上文,照着配置完再看本文。关于25端口被封无法发邮件的解决办法在本文后半部分。

做几点补充:

  1. /etc/dovecot/conf.d/10-ssl.conf中把 ssl = required改成ssl = no
  2. 注意设置/etc/postfix/main.cf中的mynetworks时,注意本地子网的IP格式,比如172.21.0.1/28就是错的,要写成172.21.0.0/28。网段计算器

安全组开放25,110,143端口

常用命令:
查看邮件队列

postqueue -p # 另一个相似命令:mailq

查看日志:

systemctl status postfix
journalctl -u postfix
# 下面这个查看的日志详细
journalctl -u postfix@-

如果你只图能收邮件,不需要往外发邮件的话,到这里已经可以结束了。

解决云服务器封了25端口导致的不能发送邮件的问题

网上说开放465端口,用SSL,我照着postfix+dovecot+SSL 搭建邮件服务器做了,但是发送邮件一直还是用25端口。

最后看了半天官方的文档,升级到了postfix3,按照官方给的说明捣鼓了半天终于是解决了。接下来是正文。

本文提供两种方法,一种是设置transport_maps,对特定地址的邮件指定端口,另一种是用iptables把25端口NAT到465端口。第一种方法测试后不太现实,推荐第二种方法。

1. 安装postfix3

systemctl stop postfix
yum remove postfix
yum install https://mirror.ghettoforge.org/distributions/gf/el/7/plus/x86_64/postfix3-3.6.2-1.gf.el7.x86_64.rpm

注意,我是Centos 7,如果你是Centos8,请使用如下命令:

yum install https://mirror.ghettoforge.org/distributions/gf/el/8/plus/x86_64/postfix3-3.6.2-1.gf.el8.x86_64.rpm

如果有版本更新,上面链接失效了,自己去网站看下最新版链接。

2. 配置postfix client tls

这里科普一点小知识,postfix分为client和server,client是往外发邮件的,server是接收邮件的。我们发邮件要用465,所以设置的是client,配置项以smtp_开头。smtpd_是服务器配置。

先跟着上文中提到的postfix+dovecot+SSL 搭建邮件服务器生成SSL证书和key,并配置好smtp-server端。
上述操作后部分配置如下:

# /etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_cert = </etc/pki/tls/certs/server.crt
ssl_key = </etc/pki/tls/certs/server.key

# /etc/postfix/main.cf
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/server.crt
smtpd_tls_key_file = /etc/pki/tls/certs/server.key
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache

到这里,在邮件客户端开启SSL收件应该已经不成问题,但是还无法发邮件。
然后参看官网的指导:
http://www.postfix.org/TLS_README.html#quick-client
http://www.postfix.org/TLS_README.html#client_smtps
先来自动生成tls client端的配置项。只有tls配置是默认时此命令才有效,否则不会更改配置文件。

postfix tls enable-client

执行结束后/etc/postfix/main.cf中应当添加了

smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_scache
smtp_tls_security_level = may
tls_random_source = dev:/dev/urandom
smtp_tls_loglevel = 1

3. 方法一、设置transport_maps 走465端口

根据官网的说明:

Postfix ≥ 3.0: Sending all remote mail to an SMTPS server

The first example will send all remote mail over SMTPS through a provider's server called "mail.example.com":

/etc/postfix/main.cf:
    # Client-side SMTPS requires "encrypt" or stronger.
    smtp_tls_security_level = encrypt
    smtp_tls_wrappermode = yes
    # The [] suppress MX lookups.
    relayhost = [mail.example.com]:465

Use postfix reload to make the change effective.

See SOHO_README for additional information about SASL authentication.

Postfix ≥ 3.0: Sending only mail for a specific destination via SMTPS

The second example will send only mail for "example.com" via SMTPS. This time, Postfix uses a transport map to deliver only mail for "example.com" via SMTPS:

/etc/postfix/main.cf:
    transport_maps = hash:/etc/postfix/transport
/etc/postfix/transport:
    example.com  relay-smtps:example.com:465
/etc/postfix/master.cf:
    relay-smtps  unix  -       -       n       -       -       smtp
        # Client-side SMTPS requires "encrypt" or stronger.
        -o smtp_tls_security_level=encrypt
        -o smtp_tls_wrappermode=yes

Use "postmap hash:/etc/postfix/transport" and "postfix reload" to make the change effective.

See SOHO_README for additional information about SASL authentication.

提供了两种方法:

  1. 所有的外发邮件全部发送到一个特定的smtps服务器
  2. 根据不同的邮件地址转发到不同的smtps服务器

我使用了我校校园邮箱(网易的企业邮箱)进行测试,(很遗憾QQ似乎没有开465端口)。经过测试,发现方法一会被当成垃圾邮件,而且显然不适用我们现在的情况(毕竟你不可能拿网易的服务器给别的邮箱做中转),方法二正常发送。
PS. 建议先用telnet看下你的目的邮箱服务器开了哪个端口,别压根没开465...

获取邮箱的交换服务器域名,即MX记录。

假定我的校园邮箱是abcabcabc@xyz.edu.cn,查询MX记录

nslookup -qt=MX xyz.edu.cn
xyz.edu.cn      MX preference = 10, mail exchanger = hzmx02.mxmail.netease.com
xyz.edu.cn      MX preference = 5, mail exchanger = hzmx01.mxmail.netease.com
xyz.edu.cn      MX preference = 15, mail exchanger = mxhm.qiye.163.com

随便记下来一个,比如hzmx01.mxmail.netease.com

按如下配置

/etc/postfix/main.cf:
    transport_maps = hash:/etc/postfix/transport
/etc/postfix/transport:
    xyz.edu.cn  relay-smtps:hzmx01.mxmail.netease.com:465
/etc/postfix/master.cf:
    relay-smtps  unix  -       -       n       -       -       smtp
        # Client-side SMTPS requires "encrypt" or stronger.
        -o smtp_tls_security_level=encrypt
        -o smtp_tls_wrappermode=yes

配置完后执行

postmap hash:/etc/postfix/transport

生成transport.db
重载配置

postfix reload

向xyz.edu.cn邮箱发送邮件,成功。

这样配置后,想给哪个邮箱发邮件都得添加transport才行,很麻烦,但是别的办法暂时没找到可行的.......
按理说可以强制全走465端口的...
慢慢再找别的方法吧,现在先凑合着用吧...

3. 方法二 465端口最新配置方法(iptables)

按之前操作成功可以发邮件,但是总不能把所有的邮箱域名都写到transport中,看了官方的transport文档,transport的配置规则是domain transport:nexthop,nexthop要么不写,让它自动去查DNS同时使用25端口;要么就指定域名和端口,无法在指定端口的同时使用DNS查询MX记录。
我想了想,ssl加密和465端口似乎没必然的联系,因为开了加密不指定端口的话还一直用25端口。那只能是在25端口上进行TLS/SMTPS通信。所以,我大胆操作,将25出端口直接映射到465端口,让所有的都按默认走25端口(实际会被转发到465),成功。具体操作如下:
/etc/poostfix/transport修改:

youdomain.com :
.youdomain.com :
* relay-smtps:

更新postfix配置文件:

postmap hash:/etc/postfix/transport
postfix reload

设置端口映射,将出的25端口映射到465,我是centos7,以iptables为例。
安装iptables.services,不然systemctl无法启动iptables。

yum install iptables-services

配置端口映射

iptables -t nat -A OUTPUT -p tcp --dport 25 -j DNAT --to-destination :465

启动iptables

systemctl start iptables

注意:启动iptables后一定不要断开ssh连接,先开另一个终端测试一下能否ssh连到服务器,因为iptables可能有预定义规则拦截,导致连不上新的ssh终端,不要问我为什么知道!如果发现无法登录新的ssh终端,请立刻systemctl stop iptables,把里面的规则删了再重来。
查看所有的iptables规则

iptables-save

删除所有规则

iptables -F

这样配置后,只要是在465端口开了SSL的邮箱就都能发,很多企业邮箱都开了,但是遭天谴的QQ邮箱只开了25端口...这就很遗憾,不能给QQ邮箱发邮件了。transport文件也可以灵活配置,对于有的不使用465端口的,可以手动添加到transport中走自己的端口。

方法二补充

时隔一年,又配了一次postfix,发现方法二完全不需要设置transport_maps和relay-smtps ,只要修改master.cf中的

smtp      unix  -       -       y       -       -       smtp

这是默认的发邮件服务,在这行下面启用tls即可,如下

smtp      unix  -       -       y       -       -       smtp
        -o smtp_tls_security_level=encrypt
        -o smtp_tls_wrappermode=yes
        -o smtp_tls_loglevel=1

然后同上设置iptables

番外篇

添加DNS记录,让邮件客户端自动配置邮件服务器。主要是配置一些SRV记录,在RFC6186中对这些记录做出了规定,主要可以配置以下几个:

_imap._tcp.         IN      SRV     10 10 143 mail.example.net.
_imaps._tcp.        IN      SRV     10 10 993 mail.example.net.
_pop3._tcp.         IN      SRV     10 10 110 mail.example.net.
_pop3s._tcp.        IN      SRV     10 10 995 mail.example.net.
_smtps._tcp.        IN      SRV     10 10 465 mail.example.net.
_submission._tcp.   IN      SRV     10 10 587 mail.example.net.

除了这些,也可以添加常见的子域名A记录解析,如smtp./mail./pop3./imap./..... ,虽然邮件客户端不一定去查,但是有些会去查,可以添加上。
更多关于自动配置的可参考

关于windows 10 mail APP无法登录dovecot pop3邮箱的解决办法:
假如你的邮箱地址是apple@goodmail.com,在windows 10 邮件app添加账户时有个“用户名”,这里只写apple,而不能带@goodmail.com。
可以使用openssl测试能否登录:

openssl s_client -connect goodmail.com:995
....
+OK Dovecot (Ubuntu) ready.
user apple
+OK
pass yourpassword
+OK Logged in

密码是明文密码。

推荐阅读