Dns解析出的ip不通导致无法发送邮件

  问题:搬入公司新址,使用一运营商的专线网络后(原来使用电信宽带),经常有同事反馈有时无法发送邮件,有时能成功。今天有同事反馈无法发邮件,但他的账号在别人pc使用上是正常的,收发没有问题。Web页面模式登录邮箱,收发正常。

  排查过程

    在自己的pc上测试发送邮件,并抓包。观察现象正常。公司使用263的邮件服务器,抓包显示如下:

接收过程:

过滤smtp | |tcp.port==995 || dns contains  “公司域名”后如下显示:

grafana 发送邮件告警 邮件发送失败原因code:30_grafana 发送邮件告警

发送过程:

tcp.port==25  ||  dns  contains  "公司域名“  后显示如下:

grafana 发送邮件告警 邮件发送失败原因code:30_ping_02

可以收发,让同事检查自己配置是否有错。有事先走了,下午问他,反馈重新安装foxmail还是没法发,安装另一款邮件程序还是发不了。

在自己的机子上测试,发现也发不了,连接错误,奇怪,抓包观察?

grafana 发送邮件告警 邮件发送失败原因code:30_ping_03

奇怪,为什么没有发smtp协议消息消息呢?过滤tcp的端口25,看这个端口有触发没有?

过滤tcp.port==25

grafana 发送邮件告警 邮件发送失败原因code:30_grafana 发送邮件告警_04

发现没有握手通过,这个ip地址211.150.65.66从哪里来的?跟踪上面的包。

grafana 发送邮件告警 邮件发送失败原因code:30_ping_05

Dns的resonse消息里有这个ip地址。

grafana 发送邮件告警 邮件发送失败原因code:30_dns解析ip_06

根据dns的发送id找到本机发出的dns 的query查询邮件发送服务器域名消息,想起foxmail里的服务器里对应域名设置。

grafana 发送邮件告警 邮件发送失败原因code:30_foxmail无法发送邮件_07

grafana 发送邮件告警 邮件发送失败原因code:30_grafana 发送邮件告警_08

根据抓包发现,这里设置的域名,发送邮件时会主动去查询。

在dos下去ping这个地址,发现ping不通。

grafana 发送邮件告警 邮件发送失败原因code:30_wireshark_09

由此,判断是dns给的这个地址不通导致发送邮件失败。

Ping域名发现,dns给的ip地址不通。

grafana 发送邮件告警 邮件发送失败原因code:30_wireshark_10

grafana 发送邮件告警 邮件发送失败原因code:30_dns解析ip_11

但有一次ping通了,获取的ip是58.215.117.69,ping这个ip是可达的。

grafana 发送邮件告警 邮件发送失败原因code:30_grafana 发送邮件告警_12

grafana 发送邮件告警 邮件发送失败原因code:30_dns解析ip_13

抓包发现dns到一个能够成功的ip,ping通了。直接ping这个ip如下图。

grafana 发送邮件告警 邮件发送失败原因code:30_grafana 发送邮件告警_14

于是把stmp服务器这里的域名改成这个ip地址,试发一下。

grafana 发送邮件告警 邮件发送失败原因code:30_grafana 发送邮件告警_15

抓包查看消息

grafana 发送邮件告警 邮件发送失败原因code:30_ping_16

发送成功,消息显示没有dns的过程,直接连接这个ip地址进入鉴权认证过程,发送过程,问题解决。

结论:

  1. Foxmail工作过程,服务器设置为域名情况下,先查询域名对应的ip地址,然后通过tcp协议连接目标ip995端口,三次握手,建立tcp连接,连上上后,使用pop3协议进行收取文件。tcp连接目标ip的25端口,三步握手建立tcp连接,连接成功后,使用smtp协议进行发送邮件。
  2. Dns查询接收发送服务器域名的过程和tcp连接收发邮件是两个过程,dns成功了,但tcp连接失败会收发失败。
  3. 相同的pc,每次dns获取到同一url地址有可能是不同的,如下图:

grafana 发送邮件告警 邮件发送失败原因code:30_wireshark_17

当获得无法tcp连接成功的ip时,会导致邮件发送失败。

不同的pc获取同一url地址也可能不同,获得可达ip地址的,发送邮件成功,反之,发送失败。

同时,每个dns获取到的url地址的ip都有一定的生存时间,当缓存中存在此对应关系时,不会再次查询,直到缓存失效。

  1. Wireshark里可用contains双引号字符串来查询协议层里包含的字符串,方便查询对应的包。如图:
  2. Foxmail里的pop3服务器和smtp服务器设置成ip,收发邮件时不进行dns查询过程,速度更快一些。
  3. Ping 域名的过程其实就是dns缓存里没有的情况下,先去dns的query过程,得到响应response后,再去向目标ip发出icmp的request消息。