今天从工作室休息完回寝室,因为这个学期在学OS ,一同学在弄VM装的CentOS,然后他就遇到了个问题,我顺便就去看了一下,帮着解决了一手,因为之前我也没遇到过这个问题,所以小小的记录一手。
问题背景
北校同学A在自己的主机上打开VM,开了一个虚拟机CentOS 7 ,此时,南校同学B想在他的主机上通过Finalshell连接到A的虚拟机,但是不知道为啥连不上......
解决过程
其实我一开始挺纳闷的,虽然我没用过Finalshell,但是吧我感觉和XShell肯定差不多,这个过程我感觉可以类比于我平常自己的主机上的XShell远程链接我的云服务器,按理来说,直接输入IP和端口,username和password后应该就可以直接连接了,不应该存在问题的,但是既然连接不上,那得想办法解决。
第一个步骤
首先自然是查看连接参数--IP ;端口;username;password是否应为粗心写错了。结果是没有问题,IP直接通过指令即可查看,因为他的是新装的Linux,ssh连接端口自然是22,我就也顺势查看了一下22端口的情况,结果是22端口没有问题
#查看IP
ifconfig
#检查端口占用情况
lsof -i:22
第二个步骤
连接参数都没有问题,那么考虑一下防火墙的因素:因为是外部连接主机内的虚拟机,那么我们得检查虚拟机的防火墙开启情况:检查后的结果发现防火墙是开的,所以此时我第一想法就是认为这个防火墙的原因,所以就关闭了防火墙准备进行测试,结果发现还是连接不上
#查看防火墙开启状态
systemctl status firewalld
#关闭防火墙
systemctl stop firewalld
#关闭防火墙自启动
systemctl disable firewalld
#确保关闭 重启虚拟机
reboot
#再次检查防火墙状态
systemctl status firewalld
第三个步骤(想通原理,找到问题)
好的,经历了上述两个步骤,感觉有点黔驴技穷的感觉,因为我们自己对于linux的研究也就那么点,平常也就用用,没有尝试过远端连主机的Linux。
一般来说,上述两个过程,也是初学者能想到的可能的方法。此时我开始从网络连接方式开始思考,是不是有哪些地方没注意。
首先,我在B同学的主机那里(远程控制),在cmd中和B同学自己的VM虚拟机中都去尝试ping一下A同学的主机和A同学的虚拟机,得到的结果是一致的:
都能ping通A同学的主机,但是都ping不通A同学的虚拟机
此时我的第一想法还是“因为虚拟机对外的网络实际上是依靠主机的,既然能连的上主机,排除了 '因为完全连不上A的主机,所以连不上A的虚拟机'的原因”
刚闪过这个想法,我突然恍然一下,就想到了一个问题:VM虚拟机的网络连接其实是分为三种的 桥接模式 ; NAT模式 ;主机模式,因为我一开始没去看A同学的连接方式,会不会是每个模式的特性问题?
(关于三种连接的区别 可以去看我的另外一篇博客文章Linux下的网络连接三种模式-CSDN博客)
此时我就去看他的连接模式----NAT模式
NAT模式其实是一种和主机共享IP地址的模式 首先虚拟机会占用一个IP但是可以和主机不是同一个网段 主机会生成一个另外一个和虚拟机IP同网段的虚拟的网卡IP 虚拟机可以和这个虚拟IP产生联系 并且可以通过主机IP的代理来和外界获得联系
也就是说 整个流程中 需要有主机的代理!!无论是发送和接收网络连接信号,其实都是以主机IP作为中转站,然后从上述描述也可以看到,虚拟机IP其实算是一个内部IP,对内部可以访问,但是对外部是隐藏的,或者你可以直接理解为,只能通过代理才能被访问的一个“虚拟的”“假的”IP
那么一切都解释的通了:因为NAT模式,虚拟机的IP是无法被外部访问的,所以B同学的Finelshell无法访问到虚拟机的这个内部IP,所以连接不上
第四个步骤(解决问题)
既然知道问题所在,那么就对应的解决即可。
虚拟机的IP既然只有内部能访问,那么我们实际上只需要连接主机,然后通过主机的代理去连接虚拟机即可。
在VM的虚拟网络编辑器中,提供了这个功能
找到NAT模式 进行NAT设置
在设置里面,我们添加端口转发功能
主机端口---填写一个不常用的端口就行(不要和平常项目或者其他服务冲突的就可以)
虚拟机IP--就填写我们的虚拟机的内部IP(用ifconfig得到的那个)
虚拟机端口--ssh连接一般都是22端口,写22就行
最后,我们在B的Finalshell进行连接的时候,我们要链接的就是IP就是主机IP,端口写上面写的主机端口,这样连接请求就会被主机端口映射代理转发到虚拟机的22端口(IP:22) 这样就能成功连接了。
总结
第一次遇到这个问题,自己尝试解决的过程很头疼但是最终还是解决完成,很有成就感,上述过程和理解思路都是个人想法,因个人知识储备有限,如果上述过程有错误或者不足之处,欢迎大家评论区批评改正!!!