![如何使用 VirtualBox 和 Ubuntu 16.04 让多个虚拟机在同一网络上进行通信?](https://linux22.com/image/136784/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20VirtualBox%20%E5%92%8C%20Ubuntu%2016.04%20%E8%AE%A9%E5%A4%9A%E4%B8%AA%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%9C%A8%E5%90%8C%E4%B8%80%E7%BD%91%E7%BB%9C%E4%B8%8A%E8%BF%9B%E8%A1%8C%E9%80%9A%E4%BF%A1%EF%BC%9F.png)
我正在努力完成一个模拟本地 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