前言
做运维工作,我们都是通过远程的方式去连接一台服务器或者虚拟机,很多初次做运维的朋友可能经常会遇到这样一个问题:我ping目标服务器的IP是通的,但是我通过ssh却不能连上主机。今天,就来浅谈一下,为什么你ping网络是通的,但是却不能连接到远程主机,当你弄懂了这个问题之后,以后遇到类似的问题,到可以迎刃而解。
认识网络架构和通信原理
作为一名运维工程师,我们不光是会linux命令,会写shell脚本,会k8s,会…,很多人往往忽略了最重要的知识,那就是网络。
我大学是学网络工程的,我记得第一门专业课就是《计算机网络原理》,很多人又会觉得,学网络以后不就是搞交换机/路由器吗?确实学了网络更适合搞这些技术,但是我要说的是,计算机网络应该是每一位学计算机,搞IT的人必修的课程。无论你将来是做开发,还是做运维,还是其它的工作,了解网络通信的原理都是必须的技能。
大部分人都学过或者是听说过,OSI网络7层模型,TCP/IP网络5层模型,如果你不是做协议开发的,你没你要很清楚网络每一层用的协议具体是怎么实现的,包括我在平时的工作中也验证了这一点,其实网络的原理你想真正搞懂确实很复杂,但你想把它想简单,它其实也很简单,你只需要记住:网络中的每一层协议,它其实就是在下一层的基础上,封装了一层新的协议去实现的,这也很符合我们生活中很多事物的特性。
为什么能ping通网络,ssh却连不上主机
无论你是搞网络的,还是搞运维的,我们平时在工作中,遇到网络排错的时候,用的最多的命令就是ping了。ping使用的ICMP协议,他既不是网络层的协议也不是传输层的协议。ping一个IP地址无非就是能通或者不能通,能通就是网络可达,什么是网络可达?网络可达就是路由可达,可达就说明至少到网络层是通的,记住这一点。我举个简单的例子,假如你要点开浏览器去访问阿里官网,首要你要确保你自己的笔记本是能ping通阿里服务器的地址或者域名的。当然,如果你ping一个IP地址不通,能说明网络就是不通的吗?
答案是否定的,这里存在一种特殊的情况,因为ping这个东西是可以在中间网络设备上给禁用掉的。我们经常会听到一句话:对方禁ping了。意思就是说对方在网络设备上做了策略,他不允许你在本端去ping它的IP地址。这种情况下,本来你们之间网络是通的,但是你去ping它,对端是不会给你响应的。此时你可以使用另外一个命令叫tracert,去探测路由是否是可达的。
接下来问题来了,现在你ping对端通了,为什么SSH不上?这里你应该想到,当你使用ssh去连接一台主机的时候,你是不是会加上一个端口?有些同学可能会说我没有加端口啊,那是因为你使用了ssh协议的时候会默认加上一个22号端口,当你要远程的那台主机正好它启动ssh服务的时候,忘了修改端口,默认也会使用22端口。那么好了,当你和他都使用的是22端口,那么你们就是达成协议,自然你就可以远程访问他了。
刚才我提到了一个很重要的词语:端口。当我提到端口的时候,你应该想到,这个关键字是在网络的传输层才会用到,也是就TCP/UDP协议。我在上文也提到了网络的架构,这里我们就可以说传输层它其实就是在网络层的基础上,又封装了一层协议,网络层是靠IP去通信,传输层是靠端口去通信,这下问题就有了解决答案,ping是去探测网络可不可达,ssh是端口通信,对端网络可达能证明端口也能访问吗?答案肯定是不可以的。
在网络可达的基础上分析ssh端口不能访问的原因
端口其实就是对应一个服务,什么是服务?最简单的理解,1个软件就是1个服务或者说1个软件它至少包括了1种服务,我们能打开百度,就是百度为我们提供80端口,并且它这个端口对应的后端服务是正常的,所有它能做出响应,给我们返回一个页面。
这里我们分析ssh端口不能访问的几种原因,我大概总结了3方面,可能性从小到大排列:
- 对方根本就没有启动ssh服务或者ssh服务挂掉了,首先需要对方检查他的主机ssh服务是否正常
- 对方修改了ssh端口,ssh服务默认使用的是22端口,通常我们不会使用默认的端口,会去自定义一个端口号。需要对端明确他使用的端口是什么
- 防火墙上做了限制,了解网络设计架构的同学应该知道,一般再网络的出口或者网络的入口会添加一个防火墙设备,这玩意儿就是专门针对端口做限制的。举个例子,你使用的源地址是192.168.10.100,如果防火墙上加了对源IP-ssh目的端口的白名单,正好你的源IP没在白名单之中,那么这一辈子你都别想ssh连上它的主机,除非防火墙宕机了。
问题的扩展延伸
我浅谈了一下网络的知识及最常见一个问题的排查思路,如果你作为一个运维工程师,你在平时的工作中,遇到某个服务或者某个网页打不开的时候,都是按照这个思路去排查。无非就是:1.分析网络可不可达;2.测试端口通不通。当然端口不通一般只是在系统上线的时候,我们会去排查中间的网络但是不是对端口做了限制,当系统真正上线后,遇到服务访问不了的时候,一般都是检查服务是否挂掉了,不会再去纠结网络中的问题。
对于那些老鸟,我这篇文档就像是开胃小菜,没什么学习或者阅读的价值,因为大家经验都很丰富了,遇到这种问题早都在脑海中形成了一套完整的处理机制。但是对于出处茅庐的小将,亦或是刚转行做运维的同学,还是提供了一些宝贵的经验,因为本人也是在遇到问题慢慢摸索,总结经验中摸爬滚打过来的。