foxmail发送邮件邮件发送失败故障排查过程
Dns解析出的ip不通导致无法发送邮件
问题:搬入公司新址,使用一运营商的专线网络后(原来使用电信宽带),经常有同事反馈有时无法发送邮件,有时能成功。今天有同事反馈无法发邮件,但他的账号在别人pc使用上是正常的,收发没有问题。Web页面模式登录邮箱,收发正常。
排查过程:
在自己的pc上测试发送邮件,并抓包。观察现象正常。公司使用263的邮件服务器,抓包显示如下:
接收过程:
过滤smtp | |tcp.port==995 || dns contains “公司域名”后如下显示:
发送过程:
tcp.port==25 || dns contains "公司域名“ 后显示如下:
可以收发,让同事检查自己配置是否有错。有事先走了,下午问他,反馈重新安装foxmail还是没法发,安装另一款邮件程序还是发不了。
在自己的机子上测试,发现也发不了,连接错误,奇怪,抓包观察?
奇怪,为什么没有发smtp协议消息消息呢?过滤tcp的端口25,看这个端口有触发没有?
过滤tcp.port==25
发现没有握手通过,这个ip地址211.150.65.66从哪里来的?跟踪上面的包。
Dns的resonse消息里有这个ip地址。
根据dns的发送id找到本机发出的dns 的query查询邮件发送服务器域名消息,想起foxmail里的服务器里对应域名设置。
根据抓包发现,这里设置的域名,发送邮件时会主动去查询。
在dos下去ping这个地址,发现ping不通。
由此,判断是dns给的这个地址不通导致发送邮件失败。
Ping域名发现,dns给的ip地址不通。
但有一次ping通了,获取的ip是58.215.117.69,ping这个ip是可达的。
抓包发现dns到一个能够成功的ip,ping通了。直接ping这个ip如下图。
于是把stmp服务器这里的域名改成这个ip地址,试发一下。
抓包查看消息
发送成功,消息显示没有dns的过程,直接连接这个ip地址进入鉴权认证过程,发送过程,问题解决。
结论:
- Foxmail工作过程,服务器设置为域名情况下,先查询域名对应的ip地址,然后通过tcp协议连接目标ip995端口,三次握手,建立tcp连接,连上上后,使用pop3协议进行收取文件。tcp连接目标ip的25端口,三步握手建立tcp连接,连接成功后,使用smtp协议进行发送邮件。
- Dns查询接收发送服务器域名的过程和tcp连接收发邮件是两个过程,dns成功了,但tcp连接失败会收发失败。
- 相同的pc,每次dns获取到同一url地址有可能是不同的,如下图:
当获得无法tcp连接成功的ip时,会导致邮件发送失败。
不同的pc获取同一url地址也可能不同,获得可达ip地址的,发送邮件成功,反之,发送失败。
同时,每个dns获取到的url地址的ip都有一定的生存时间,当缓存中存在此对应关系时,不会再次查询,直到缓存失效。
- Wireshark里可用contains双引号字符串来查询协议层里包含的字符串,方便查询对应的包。如图:
- Foxmail里的pop3服务器和smtp服务器设置成ip,收发邮件时不进行dns查询过程,速度更快一些。
- Ping 域名的过程其实就是dns缓存里没有的情况下,先去dns的query过程,得到响应response后,再去向目标ip发出icmp的request消息。