如何使用 VirtualBox 和 Ubuntu 16.04 让多个虚拟机在同一网络上进行通信?

如何使用 VirtualBox 和 Ubuntu 16.04 让多个虚拟机在同一网络上进行通信?

我正在努力完成一个模拟本地 DNS 攻击的网络安全实验室(该实验室由雪城大学的 SEEDLab 开发)。为了进行安全测试,我应该创建三个虚拟机:server_VM、user_VM 和 Attacker_VM。我正在使用运行 Ubuntu 16.04 的 VirtualBox。

我已经创建了虚拟机,现在我需要同时运行它们,同时在它们之间来回切换,以便在 Ubuntu 终端中输入命令。当我尝试同时运行它们时,我不断收到以下消息:

Failed to open a session for the virtual machine User.

Locking of attached media failed. A possible reason is that one of the media is attached to a running VM.

Result Code: VBOX_E_INVALID_OBJECT_STATE (0x80BB0007)

Component: SessionMachine

Interface: IMachine {b2547866-a0a1-4391-8b86-6952d82efaa0}
How do I go about getting the VMs to run simultaneously so that I can communicate with each one by way of command line?

我只是想让虚拟机启动并运行,如果我现在能让虚拟机正常工作,我会很满意。非常感谢。

其他信息:

我为每个虚拟机使用默认网络模式 (NAT)。以下是特定实验室网站的链接本地 DNS 实验室描述,以及提供实验室说明的 pdf本地 DNS 实验室说明

答案1

您的错误消息是由虚拟机使用相同的介质引起的。
这可能是因为您为虚拟机使用了相同的虚拟硬盘映像,而这不起作用。每个虚拟机都需要自己的虚拟硬盘。
另一种可能性是 Ubuntu 的安装介质(ISO 文件)在运行时链接到所有 3 个虚拟机。仅基础安装需要此 ISO,因此在安装完第一个 VM 后,您可以断开 ISO 并将其用于第二个 VM。

至于网络部分:VM 设置为 NAT,放置在使用 10.0.0.x IP 范围的虚拟网络中。 Virtualbox 将为该子网设置 dhcp,并确保将 DNS 等转发到常规 DNS。它根据主机系统的网络配置来执行此操作,因此需要正确设置。
作为替代方案,您还可以在虚拟机之间设置仅主机网络。在这种情况下,虚拟机在隔离网络中运行,该网络仅对虚拟机和主机可见。
无论如何,请参阅优秀的 Virtualbox 手册。它有一个关于网络的广泛部分,包括(仅限命令行)命令,这些命令比 GUI 配置提供更多的可能性。

答案2

如果您使用 Vagrant,您可以使用以下Vagrantfile命令来配置 3 个盒子(Ubuntu 16.04)。

$ cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :


##############
### References
# - https://www.vagrantup.com/docs/vagrantfile/machine_settings.html
# - https://www.vagrantup.com/docs/vagrantfile/tips.html
# - https://www.vagrantup.com/docs/networking/forwarded_ports.html
##############

#unless Vagrant.has_plugin?("HostManager")
#  raise 'HostManager plugin not installed!'
#end

image = "ubuntu/xenial64"

Vagrant.configure("2") do |config|
  vboxName1 = "box-101"
  hostname1 = "box1"
  config.vm.define "#{vboxName1}" do |box|
    box.vm.box = "#{image}"
    #box.vm.network :private_network, ip: "192.168.56.101"
    box.vm.network :public_network, use_dhcp_assigned_default_route: true
    box.vm.provider :virtualbox do |v|
      v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      v.customize ["modifyvm", :id, "--memory", 512]
      v.customize ["modifyvm", :id, "--name", "#{hostname1}"]
    end
  end

  vboxName2 = "box-102"
  hostname2 = "box2"
  config.vm.define "#{vboxName2}" do |box|
    box.vm.box = "#{image}"
    #box.vm.network :private_network, ip: "192.168.56.103"
    box.vm.network :public_network, use_dhcp_assigned_default_route: true
    box.vm.provider :virtualbox do |v|
      v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      v.customize ["modifyvm", :id, "--memory", 512]
      v.customize ["modifyvm", :id, "--name", "#{hostname2}"]
    end
  end

  vboxName3 = "box-103"
  hostname3 = "box3"
  config.vm.define "#{vboxName3}" do |box|
    box.vm.box = "#{image}"
    #box.vm.network :private_network, ip: "192.168.56.103"
    box.vm.network :public_network, use_dhcp_assigned_default_route: true
    box.vm.provider :virtualbox do |v|
      v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      v.customize ["modifyvm", :id, "--memory", 512]
      v.customize ["modifyvm", :id, "--name", "#{hostname3}"]
    end
  end
end

使用方法:

# launches all VMs
$ vagrant up

# ssh into box-101
$ vagrant ssh box-101

有关使用的更多信息,vagrant请参阅用法:

$ vagrant

相关内容