为什么我能ping通,但不能访问呀?

1,323 阅读3分钟

今天接到了个需求,为了保证数据的一致性,需要把测试环境的数据同步到线上,其中同步的接口(接口有两个:一个发送,一个接收)已经写好了,小弟兴致勃勃的部署好线上环境,准备通过postman调用测试环境的同步接口,然后把数据同步到线上,但当点击Send的时候出问题了,提示同步超时,这个早有预警,怀疑是线上和测试环境是隔离的,于是急匆匆的登录到测试环境的实例上,ping了一下对应的线上的域名,结果是可以ping通,这不合理啊? 为了以防万一,本人又试了一下curl命令,但是符合预期,请求失败了,这时候小弟就有疑惑了,这网络到底通还是不同呢?

通过查阅公司的网络安全相关文档,首先得出了一个结论,那就是网络是不通的!!!所以新的问题就来了,既然网络隔离,那为什么我能ping通?为了弄明白这个问题,现在首要做的就是搞清楚ping的工作原理,于是小弟开始上网查资料,很幸运,找到一篇介绍ping的文章,www.cnblogs.com/xiaolincodi… 这篇文章讲解的很好,如果各位老铁时间充裕,可以停下来先阅读下,没时间的话,我来简单总结下:ping命令底层使用了ICMP协议,这个协议工作在IP层,用来检测IP包是否发送成功。

所以能ping通说明测试环境的IP包是可以发送到线上环境的,那由此可以推断:网络隔离是在IP网络层的上面的某一层做的。这也就解释了为什么curl超时的原因,因为curl涉及到了应用层http协议了。

解决了第一个问题,又有一个小细节是小弟有点困惑,小弟在ping的是一个域名,但是ping通的信息中并不是小弟的机器所在的ip,而是一个nginx集群的ip,这就延伸出了两个问题:

1. ping一般都是ping ip的,ping域名的时候会发生什么? 实际上ping域名首先要做的就是根据域名找到IP,这个过程并不陌生,就是面试中经常会考的问题,在浏览器输入框输入域名时会发生什么的找IP的那段过程。

2. 为什么没有通过域名找到真正的ip? 不过这个问题稍加思索,就理解了,外部的服务要访问本地服务,肯定要经过nginx,然后再由nginx发送到实际的本地服务,由于ping的是一个域名,这个域名肯定是和nginx有关的,另外本地服务一般都是内网ip,想要直接ping,肯定也ping不通。

总算一晚上把这个疑惑给解决掉了,但是有个问题还没解决。。。那就是这个同步数据的需求用目前的方案是搞不定了,只能另谋出路了