在进行分布式开发的过程中需要配置主机和服务器的ssh服务。在学习的过程中只能通过配置虚拟机来进行。我用的电脑是Mac,使用了VirtualBox来配置虚拟机服务。
VirtualBox的5种连接方式
- NAT :虚拟机可以通过宿主机访问主机能够访问的一切网络,宿主机不能访问虚拟机,虚拟机之间不能访问
- NAT网络 :在NAT的基础上,虚拟机之间搭建了局域网,可以实现虚拟机之间的相互访问
- 桥接 :相当于虚拟机与宿主机连接在同一局域网内,相对于宿主机可见,可以看成是一台连接的宿主机
- 内部 :虚拟机不能连外网
- 仅主机(host-only) :虚拟机不能连外网,并且不互通
在进行开发的最开始我选择了桥接模式,但桥接模式每一台虚拟机都会占用一个真实的ip地址,会造成ip地址极大的浪费。并且分布式一般需要设置固定ip,使用桥接模式经常会造成局域网内ip冲突。因此想到用NAT网络对建立的虚拟机网络进行隔离。
NAT面对的需求
- 虚拟机可以连外网
- 虚拟机与主机互通
- 虚拟机与虚拟机互通
- 虚拟机需要固定IP (防止意外)
- 主机所在局域网的其他机器访问虚拟机
VirtualBox NAT Network的配置方法
1. VirtualBox全局设置
在VirtualBox中添加一块网卡来实现NAT Network。
Preference=>Network=>右边的三个小图标中的Configure设置。如果Network中没有网卡的话添加一个。
2. 虚拟机网络设置NAT Network
注意首先关闭虚拟机,再进行虚拟机网络设置。
Network=>attached to =>NAT Network
3. 启动虚拟机,设置虚拟机网络配置
1 | $ vim /etc/sysconfig/network-scripts/ifcfg-enp0s3 注意这里的enp0s3是网卡的名字,每台机器可能不一样,换成你自己的 |
上述配置中,因为在步骤1中的全局设置中,NAT局域网段设置为了10.0.2.0/24(也就是GATEWAY=10.0.2.1,NETMASK=255.255.255.0 24位子网掩码),所以你设置的IPADDR必须是在这个网段内的地址。
此时ping一下www.baidu.com 看是否实现了外网访问。使用ifconfig来查看当前本机ip地址是什么。这表示虚拟机可以访问外网。
4. 主机访问虚拟机,采用NAT端口映射
虚拟机采用NAT网络配置,虚拟机的ip相对于宿主机是隐藏的。想要使得宿主机对虚拟机进行访问,需要配置端口映射,即通过将宿主机的一个端口(localhost:port)与虚拟机的ssh端口进行连接,宿主机通过访问宿主机端口(localhost:port)实现对虚拟机ssh端口(ip:22)的访问。
注意,这个端口是一一对应的。因为整个虚拟机子网10.0.2.0/24网段对主机是隐藏的,主机要想访问虚拟机子网中的任意一台虚拟机,就必须建立一个独立的宿主机端口与虚拟机的ssh端口进行连接。
配置NAT端口映射,如下:
在VirtualBox全局设置中,配置端口映射Port Forwarding (在步骤1中的NAT网卡设置)
在宿主机中,ssh访问localhost:port (localhost地址为127.0.0.1)
1 | ssh hadoop@127.0.0.1 -p 23333 或者 |
这样就实现了宿主机与虚拟机之间的访问
5. 虚拟机与虚拟机之间的访问
虚拟机之间使用ip地址就可以了,因为虚拟机之间由虚拟局域网连接。
参考SSH 远程登录
至此,我们就完成了NAT Network下虚拟机配置的全部操作。
相比于桥接模式,极大的节省了ip资源,也减少了因为虚拟机存在导致对主机局域网的干扰。