在VirtualBox中,如何设置可以上网的host-only虚拟机?

Chr*_*ong 103 virtualbox networking virtualization

在用VirtualBox设置虚拟机时,我经常想要以下特性

  • 虚拟机有一个静态 IP
  • 主机无需端口转发即可访问VM
  • 虚拟机可以上网
  • 我可以将我的笔记本电脑从一个网络移动到另一个网络(例如从家到办公室到咖啡店),而无需担心保护或重新配置 VM

VirtualBox 网络连接方法都不能单独满足这些要求。

  • NAT
    如果要从主机连接到 VM,则需要端口转发。

  • Host-only
    除非主机是路由器,否则虚拟机无法访问互联网。

  • Bridged
    将 VM 暴露给网络;不便携。

Chr*_*ong 116

我可以通过在 vm 上设置两个适配器来获得我想要的设置。

VirtualBox 4.2.12
Ubuntu 12.04 来宾

在 VirtualBox > Preferences > Network 中,设置一个仅限主机的网络。

我的是vboxnet0,手动配置:
ip 192.168.56.1
netmask 255.255.255.0
no dhcp

VirtualBox 网络配置 VirtualBox 网络配置

然后,在虚拟机的网络设置中,设置两个适配器:


仅适配器 1主机,vboxnet0

适配器 2
NAT

启动虚拟机并通过 VirtualBox 提供的控制台登录。

运行它以查看您的适配器:

ls /sys/class/net
Run Code Online (Sandbox Code Playgroud)

在我的例子中,适配器被命名为 eth1 和 eth2(还有,环回接口)。

然后,编辑您的网络配置。

sudoedit /etc/network/interfaces


# The loopback network interface
auto lo
iface lo inet loopback

# Host-only interface
auto eth1
iface eth1 inet static
        address         192.168.56.20
        netmask         255.255.255.0
        network         192.168.56.0
        broadcast       192.168.56.255

# NAT interface
auto eth2
iface eth2 inet dhcp
Run Code Online (Sandbox Code Playgroud)

请注意,eth1没有指定默认网关。eth2将从 dhcp 获得默认网关。


2018 年 3 月更新

这个答案来自@ Hugo14453一个更新的版本与Ubuntu 17.10和更新工作。

  • 这对我有很大帮助,我使用 Virtualbox 进行开发,当我在家时,一切正常,因为我的网络设置符合我的喜好,当我搬到另一个网络(家庭、公司...... ),我必须更改网站 URL,删除一些系统文件,重新启动我不知道多少次,列表还在继续。此解决方案不关心您当前的网络,这就是我喜欢它的原因...只需将您的 PC 连接到任何网络并专注于您的工作。 (4认同)
  • 完美的。/etc/network/interfaces 配置是关键 谢谢!!! (2认同)

小智 17

我可以用 Christian Long 的混合解决方案来解决我的问题。我添加了 2 个适配器:

适配器 1 - NAT

适配器 2 - 仅主机,vboxnet0

唯一的区别在于 VM 的接口文件:

sudoedit /etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback
# NAT
auto eth0
iface eth0 inet dhcp
# Host only
auto eth1
iface eth1 inet dhcp
Run Code Online (Sandbox Code Playgroud)

在 VirtualBox 网络配置中,我选中了 DHCP。

虚拟机重启后一切正常。


Hug*_*ugo 17

Ubuntu 17.10.1 中的网络配置已更改。您现在使用 netplan 配置。

在这里遵循了本指南

作为基督教答案的迁移,请执行以下操作:

在 /etc/netplan 中创建一个新的配置文件来保存您的仅主机适配器配置。

例如 sudo nano /etc/netplan/02-netcfg.yaml

输入以下内容以配置静态 IP 192.168.56.12,其中enp0s3是仅主机适配器的名称。

network:
    version: 2
    renderer: networkd
    ethernets:
        enp0s3:
            addresses:
                - 192.168.56.12/24
            dhcp4: no
Run Code Online (Sandbox Code Playgroud)

然后运行以下两条命令:

sudo netplan generate
sudo netplan apply
Run Code Online (Sandbox Code Playgroud)

NAT 应该可以在没有配置的情况下工作,运行ifconfig以查看结果:

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.12  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::a00:27ff:fe06:6cdd  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:06:6c:dd  txqueuelen 1000  (Ethernet)
        RX packets 252  bytes 23076 (23.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 208  bytes 30015 (30.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.3.15  netmask 255.255.255.0  broadcast 10.0.3.255
        inet6 fe80::a00:27ff:fe4d:a6b8  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:4d:a6:b8  txqueuelen 1000  (Ethernet)
        RX packets 95  bytes 94894 (94.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 85  bytes 7436 (7.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
Run Code Online (Sandbox Code Playgroud)


小智 14

还有另一种简单的方法,我们不需要创建新的 NAT 适配器

  1. 在宿主机上,请添加以下iptables规则。这将通过主机将数据包转发到 Internet:

    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 -A POSTROUTING -t nat -j MASQUERADE
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您还需要通过发出以下命令在主机上启用 IP 转发:

    sudo sysctl -w net.ipv4.ip_forward=1
    
    Run Code Online (Sandbox Code Playgroud)