VirtualBox NAT 端口映射实现宿主机与虚拟机相互通信

在进行分布式开发的过程中需要配置主机和服务器的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中没有网卡的话添加一个。
preference-network
preference-network
2. 虚拟机网络设置NAT Network
注意首先关闭虚拟机,再进行虚拟机网络设置。
Network=>attached to =>NAT Network
VM-network
3. 启动虚拟机,设置虚拟机网络配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ vim /etc/sysconfig/network-scripts/ifcfg-enp0s3 注意这里的enp0s3是网卡的名字,每台机器可能不一样,换成你自己的

将这个文件中的如下配置修改或添加成如下:
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.0.2.14
NETMASK=255.255.255.0
GATEWAY=10.0.2.1
DNS1=114.114.114.114
DNS2=8.8.8.8

然后启动该网络设置
$ systemctl restart network 或者
$ service network restart

上述配置中,因为在步骤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地址是什么。这表示虚拟机可以访问外网。
VM-network-configuration
4. 主机访问虚拟机,采用NAT端口映射
虚拟机采用NAT网络配置,虚拟机的ip相对于宿主机是隐藏的。想要使得宿主机对虚拟机进行访问,需要配置端口映射,即通过将宿主机的一个端口(localhost:port)与虚拟机的ssh端口进行连接,宿主机通过访问宿主机端口(localhost:port)实现对虚拟机ssh端口(ip:22)的访问。
注意,这个端口是一一对应的。因为整个虚拟机子网10.0.2.0/24网段对主机是隐藏的,主机要想访问虚拟机子网中的任意一台虚拟机,就必须建立一个独立的宿主机端口与虚拟机的ssh端口进行连接。
配置NAT端口映射,如下:
在VirtualBox全局设置中,配置端口映射Port Forwarding (在步骤1中的NAT网卡设置)
NAT-port-forwarding
在宿主机中,ssh访问localhost:port (localhost地址为127.0.0.1)

1
2
ssh hadoop@127.0.0.1 -p 23333 或者
ssh hadoop@localhost -p 23333

localhost-ssh-access
这样就实现了宿主机与虚拟机之间的访问
5. 虚拟机与虚拟机之间的访问

虚拟机之间使用ip地址就可以了,因为虚拟机之间由虚拟局域网连接。
参考SSH 远程登录
batch-access
至此,我们就完成了NAT Network下虚拟机配置的全部操作。
相比于桥接模式,极大的节省了ip资源,也减少了因为虚拟机存在导致对主机局域网的干扰。