对于我在主机上安装的程序,该程序需要来自虚拟机的结果,我需要设置我的虚拟机(https://utopianknight.com/malware/cuckoo-installation-on-ubuntu-20/) 为仅主机。通常,仅主机不应有互联网,但是,在本教程中,我需要按照一些步骤为虚拟机提供互联网访问权限:
vboxmanage hostonlyif create
vboxmanage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1
然后为虚拟机选择 vboxnet I/F。现在使用 iptables,设置以下网络转发规则以向虚拟机提供互联网连接:
sudo iptables -A FORWARD -o eth0 -i vboxnet0 -s 192.168.56.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
现在,内核中的 IP 转发使这些设置被设置为 Active(WWW 互联网访问所需):
echo 1 | sudo tee -a /proc/sys/net/ipv4/ip_forward
sudo sysctl -w net.ipv4.ip_forward=1
我的问题是:
我想知道这里到底发生了什么,以及这些规则如何允许仅主机的虚拟机连接到互联网,否则它就不应该连接到互联网。
我有另一台配置了桥接网络的虚拟机。我的主机能够 ping 通我的仅主机虚拟机,但我的桥接虚拟机无法 ping 通仅主机虚拟机,即使主机(非主机虚拟机)和桥接虚拟机都位于同一子网中。那么为什么桥接虚拟机无法 ping 通仅主机虚拟机?为什么我需要将仅主机接口 (vboxnet0) 作为第二个接口添加到我的桥接虚拟机,以便它可以 ping 通仅主机虚拟机?
如果有人能帮我解释一下,我将不胜感激。提前谢谢。
答案1
通常,为了理解事物,我们将网络分为几层(在 OSI 含义中),并从属于其他层的无关细节中抽象出来。在第 1 层(物理层)中,我们有一个物理连接到某个网络的主机。但是,在第 2 层,我们有两个系统:一个具有两个以太网接口的主机(其中一个是 ,eth0
另一个是vboxnet0
)和一个具有一个以太网接口的虚拟机。主机通过 连接到 WAN eth0
,vboxnet0
连接到虚拟机的接口。
应该这样理解。暂时抛开虚拟机、虚拟化主机、“仅主机”网络及其感知到的“限制”等所有细节。这就是您的网络的样子(尽管是虚拟的,但网络始终是虚拟的,它只是物理事物之上的一个假想层):
(Internet) --- [eth0] Host [vboxnet0] --- [eth0] VM
因此,为eth0
和分配一些地址vboxnet0
,并确保这些地址来自不同的子网。虚拟机的 vNICeth0
应具有与地址来自同一子网的 IP vboxnet0
,以便您的虚拟机和主机可以通信。
您有两台计算机相互连接,其中一台也连接到互联网。如果“主机”计算机上没有特殊设置,“虚拟机”上将没有互联网连接,对吗?这就是为什么人们通常认为“仅主机”网络不允许互联网连接的原因。
但是,如果您在“主机”计算机上执行此特殊设置,“虚拟机”将能够通过它访问互联网。为此,“主机”计算机应该成为路由器,并且可选择执行 NAT 来在某种程度上“隐藏”另一台计算机的存在,这样它的互联网连接就会被“束缚”。
我所说的特殊设置如下:您需要在“主机”计算机上启用数据包转发,这样它就会为另一台计算机(恰好是虚拟机)传递数据包,并且您分配给主机的任何地址都vboxnet0
被配置为默认网关在虚拟机上,所以它知道应该通过主机访问互联网。
eth0
主机端的系统应该知道在哪里可以找到您用于vboxnet0
和 VM 的网络eth0
,您需要通过主机的eth0
地址向它们添加通向此网络的路由。或者,如果您选择 NAT 路径,则需要将从“WAN”接口发出的所有 VM 数据包转换为主机“WAN”地址的地址。在这种情况下,“WAN”接口为eth0
:
iptables -t nat -A POSTROUTING -s <vboxnet0-network> -o eth0 -j MASQUERADE
(-j SNAT --to-source <eth0-address>
也能工作并允许更细粒度的 NAT 设置,但-j MASQUERADE
如果动态接收其地址则更容易、更方便eth0
)。
原则上,如果你没有在主机上设置任何其他防火墙,这是全部您需要。在这种情况下ACCEPT
,您添加到filter
表中的规则是多余的。但是如果您有其他设置(例如,如果FORWARD
策略设置为DROP
流量,或者您在表中有丢弃规则filter
FORWARD
),则需要添加其他规则,以允许 VM 数据包来回传递。
简短摘要
- 抽象无关的细节。虚拟网络是完全正确的网络,应如此对待。就网络连接而言,虚拟机与物理机没有绝对的区别。只需假设所有计算机、所有接口和连接都是真实的,然后继续往前走。
- 仅主机网络从未意味着将虚拟机与互联网“隔离”。它的意思就是它所说的:在这种模式下,虚拟机具有唯一的连接 - 其虚拟网络接口连接到主机上的某个特殊网络接口。如果主机恰好是路由器,它可能会为虚拟机路由数据包,使其能够访问互联网。
更新
即使主机(不是主机虚拟机)和桥接虚拟机都位于同一子网中
这就是无法 ping 通的原因。桥接计算机和仅主机计算机位于不同的以太网段。再想想,您在一台名为“主机”的计算机上有三张以太网卡。其中两张桥接在一起。卡连接到其他系统:
(Internet) --- [eth0 + BridgedHostIf] --- [vNIC] VM-2
Host
[HostOnlyIf]
|
[vNIC]
VM-1
因此,这里有三个第 2 层接口,但只有两个第 3 层 (IP) 接口:桥接器(之所以这样命名,是eth0
因为它是一种使用 VirtualBox 怪癖制作的“类型”桥接器)和 HostOnlyIf。
现在,当我为您分解了您的网络后,让我用不同的术语问您的第二个问题:如果您在同一台计算机上的两个不同网络接口上配置同一个网络,会发生什么情况?这些机器能够相互通信吗?需要做什么才能使它们能够通信?
请注意,这里我们确实有一些深奥的 VirtualBox 魔法。确切地VirtualBox 桥接代码利用主机网络堆栈以及它如何与内核中的其他网络交互,包括 Netfilter 代码(执行 NAT)和路由/数据包转发代码。我真的不知道。如果 VirtualBox 桥接是原生 Linux 桥接,我就可以解释。但要了解 VirtualBox“桥接”的真正工作原理,您需要阅读其源代码。抱歉。
这部分的教训是不要尝试在服务器上运行 VirtualBox。考虑到其用户友好的桌面界面,它旨在用于开发人员的台式机。它实际上并不是为在服务器上运行而设计的。如果您想要拥有可预测和可配置的虚拟化生产环境,请使用适当的东西,例如基于 libvirt 或 Proxmox VE。