DevOps文化 & SRE实战分享平台

0%

一个路由引发的邮件系统异常血案


文章声明:此文基于木子实战撰写。
生产环境:CentOS 7.x iptables防火墙
论证耗时:1h
撰文耗时:30m
校文耗时:15m
问题关键字:552 you must authentication


写在最前面

这是一个因为路由而引起的邮件系统异常血案,故事发生在2017年。虽然时间已经过去了3年,但IT从业法则底层原理的东西是永恒不变的。通过这个问题不仅仅可以让我们了解SMTP的基础工作原理,也能够了解iptables防火墙的工作原理。表面上看这是一个邮件系统本身的问题,但实际一个问题的发生,有时候并非一个浅显的原因造成的,真相往往比现实残酷,需要IT从业人员有更强的综合问题分析能力。

环境说明

简单说明一下木子的网络环境,木子这边是通过iptables做为防火墙来进行NAT上网及邮件收发的。其中bond0为外网口,并且绑定有多个公网地址。bond1为内网口,内网口划分了多个VLAN。其实这个问题的原因就在于此网络架构,后面我们会说到。

问题说明

当木子设置DNAT以后,进行邮件测试发送,邮件被邮件服务器退回,报错信息552 you must authentication,详细如下图所示。

从表面看是SMTP认证问题,让人想到的是SMTP认证失败的原因造成的,但根据个人经验判断肯定不是这个原因。

定位问题

尝试telnet 25 110 端口无异常,可以正常连接。

这时候我们可能需要简单了解一下SMTP的工作原理。简单说就是SMTP需要发送方进行响应,就是邮件服务器需要响应。这时候我们可以想像一下这里的认证如果不是原服务器返回,或根本没有返回,那对方就会放弃这封邮件不进行接收。这里让木子想到的就是iptables和ROS一样有一个回流的问题,即出去以后返回的信息的一个处理。

这时候我们就需要了解一下iptables的PREROUTING和POSTROUTING了。PREROUTING是路由前转换,而POSTROUTING是路由后转换。
简单关系图:
源地址发送数据–> {PREROUTING–>路由规则–>POSTROUTING} –>目的地址接收到数据
可能上面的说明还没有办法让你彻底了解iptables防火墙工作原理,这时候你可能需要找一篇专门讲解iptables原理的文章熟悉一下。其实这就是一个路由回流的问题。因为当时没有在对应的邮件服务器上抓包,所以这里看着思路可能不是很清晰。

解决问题

找到问题产生的原因,解决问题就简单了。首先我们需要做一个入站目标地址转换。

1
2
3
4
#入站目标地址转换
-A PREROUTING -i bond0 -d 110.88.12.88 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.1.55
-A PREROUTING -i bond0 -d 110.88.12.88 -p tcp -m tcp --dport 110 -j DNAT --to-destination 192.168.1.55
-A PREROUTING -i bond0 -d 110.88.12.88 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.1.55

上面的iptables语言翻译成人话就是:
当从bond0(当然你的公网口有多个IP的时候,需要加一个-d 110.88.12.88)接口的25端口流入数据时,iptables防火墙会在“路由规则”之前将目的地址改为192.168.1.55,并且iptables会同时标记下这个连接,并在数据从192.168.1.55返回时,经过iptables将数据发送到那台发出请求的机器(有点废话了)。这时候你的POSTROUTING规则不会起作用。

#端口回流配置,这个是用于内部用户发送邮件的时候进行端口重定向,也就是回流使用的。如果你内部没有其它网段的话,就不需要配置了(为什么了?各位博友可以思考一下,我们可以在留言区讨论。)
从接口bond1进来的流量,目标IP是110.88.12.88 目标端口25的,做目标地址转换至192.168.1.55,这样就避免了回程路由问题。

1
2
3
-A PREROUTING -i bond1 -d 110.88.12.88 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.1.55
-A PREROUTING -i bond1 -d 110.88.12.88 -p tcp -m tcp --dport 110 -j DNAT --to-destination 192.168.1.55
-A PREROUTING -i bond1 -d 110.88.12.88 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.1.55

写在最后

至此这个iptables防火墙引发的邮件系统异常问题就解决了。其本质并不在于邮件系统本身,而在于防火墙的设置,当然如果是买的傻瓜式防火墙,界面点几下就OK的,也不用考虑这些问题,防火墙厂商已经都考虑到了。

坚持原创技术分享,您的支持与鼓励,是我持续创作的动力!