背景:
我们有一个第三方的系统支持通过邮件发送报警,但是只支持基本的smtp功能,输入账号密码/邮箱地址/邮件服务器地址/端口号,却不支持加密功能,试了下starttls和ssl加密都不行。所以最终解决方案是加一个smtp代理来实现加密功能。
1. 方案一:
nginx搭建smtp代理,看了好多文档基本都是介绍反向代理的,认证功能还需要再弄一个服务,而且网上看到的认证基本都是用来实现客户端的认证,upstream的认证并没有找到,所以索性就放弃了。
2. 方案二:
nginx stream ssl代理,这个方法本来是可以行的通的,在stream代理上开启proxy_ssl on, upstream就回自动使用ssl加密。注意starttls是不行的,因为工作在应用层,stream代理无法实现。 但是遇到另外一个更坑爹的问题,ssl是可以了,但是认证死活不会通过。后来把加密去掉后抓包,发现认证的密码被截断了,原因是这个第三方应用的最大密码长度为30,我们用的aws ses的sk是44字节。
3. 方案三:
postfix搭建邮件转发服务。期间遇到过不少问题,这里一一记录下。
3.1 安装
用的是aws linux, sudo yum install postfix cyrus-sasl-plain
3.2 配置
这里有一个地方需要注意的是,smtpd开头的配置都是作为smtp server的参数,smtp开头的配置是作为smtp client的参数。如果要配置收邮件相关,应该是smtpd开头,如果是发邮件到server上,那么就应该是smtp开头。之前在这里马虎了结果浪费了很多时间。
a. /etc/postfix/main.cf
relayhost = [upstream.mail.server]
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
#smtp_sasl_tls_security_options = noanonymous tls相关的配置感觉可以忽略了,会默认使用starttls在应用层做加密
#smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
#smtp_use_tls = yes
b. /etc/postfix/sasl_passwd 这里用来存放连接smtp服务器时的认证信息
[upstream.mail.server] username:password
配置好后执行sudo postmap /etc/postfix/sasl_passwd,会自动生成一个加密后的文件/etc/postfix/sasl_passwd.db
3.3 客户端认证
既然是邮件转发,那么客户端发送邮件到代理服务器的时候也需要认证。
a. /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes #开启认证
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
b. /etc/sasl2/smtpd.conf
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: plain login CRAM-MD5 DIGEST-MD5
c. saslpasswd2 -c -u abc.com test 创建客户端邮箱账号, 此条命令会为test@abc.com创建账号密码,在提示输入密码之后,两次确认密码即可成功创建。
d. sasldblistusers2 查看客户端邮箱账号列表
e. systemclt restart postfix重启服务生效
3.4 日志排查
网上很多地方说日志在/var/log/maillog里,但是排查了好久也没弄出这个日志,有要求安装rsyslog的,但是也没有解决问题。最后是通过journalctl | grep mail看到了日志。
先记录到这里吧。