95

In setting up virtual machines with VirtualBox, I often want the following characteristics

  • vm has a static ip
  • host can access vm without port forwarding
  • vm can access the internet
  • I can move my laptop from network to network (e.g. from home to office to coffeeshop) without worrying about securing or reconfiguring the vm

None of the VirtualBox network connection methods staisfies these requirements on their own.

  • NAT
    Requires port forwarding if you want to connect to the vm from the host.

  • Host-only
    The vm can not access the internet, unless the host is a router.

  • Bridged
    Exposes the vm to the network; not portable.

110

I can get the setup I want by setting up two adapters on the vm.

VirtualBox 4.2.12
Ubuntu 12.04 guest

In VirtualBox > Preferences > Network, set up a host-only network.

Mine is called vboxnet0, it is manually configured:
ip 192.168.56.1
netmask 255.255.255.0
no dhcp

VirtualBox network configuration VirtualBox network configuration

Then, in the network settings for the virtual machine, set up two adapters:

Adapter 1
host only, vboxnet0

Adapter2
NAT

Boot the virtual machine and log in through the console VirtualBox provides.

Run this to see your adapters:

ls /sys/class/net

In my case the adapters were named eth1 and eth2 (and lo, the loopback interface).

Then, edit your network configuration.

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

Note that eth1 has no default gateway specified. eth2 will get a default gateway from dhcp.


Update March 2018

See this answer from @Hugo14453 for an updated version that works with Ubuntu 17.10 and newer.

  • 1
    Update: VirtualBox 4.3 introduced a NAT service that looks like it might obviate the need for two interfaces. 6.4. Network Address Translation Service – Christian Long Jan 26 '14 at 17:36
  • 4
    This helped me a lot, I use Virtualbox for development, and when I'm in my house, everything works correctly since I have the network setup to my likings, the nightmare starts when I move to another network (family, companies...), I have to change websites URLs, delete some systems files, reboot I don't know how many times and the list goes on. This solution doesn't care about your current network which is why I like it...Just plug your PC to any network and focus on your work. – Nabil Kadimi Jun 14 '14 at 11:22
  • 1
    Thanks. Not defining a gateway address for the host-only interface solved my issues. – Florian Jul 21 '16 at 10:20
  • 2
    Perfect. /etc/network/interfaces config was key THANKS!!!! – Byron Whitlock Nov 1 '16 at 20:35
  • 1
    "Note that eth1 has no default gateway specified. eth2 will get a default gateway from dhcp." <-- THIS COMMENT IS THE KEY. – Pere Pages Apr 11 '17 at 11:18
16

I could solve my problem with a mix of Christian Long solution. I added 2 adapters:

Adapter 1 - NAT

Adapter 2 - host only, vboxnet0

The only diference was in VM's interfaces file:

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

In VirtualBox Network config I left DHCP checked.

After a VM reboot everything worked fine.

  • This works for me, but I want the VMs to have static IP addresses. The minute I do that, Internet stops working. If I set up both with DHCP, it works fine. How do I make the host-only interface get a static IP? – Umar Farooq Khawaja Apr 7 '14 at 23:27
  • Only one that worked. Thanks. +1 – Jorge Campos Aug 29 '16 at 14:43
14

There is another simple way that we don't need to create a new NAT adapter

  1. On the host machine, please add the following iptables rules. This will forward packets through the host and on to the 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
    
  2. You will also need to enable IP forwarding on the host by issuing the following command:

    sudo sysctl -w net.ipv4.ip_forward=1
    
  • This works only on a Linux host. – Derek Mahar Oct 18 '16 at 20:57
  • We need the "dnsmasq" service running. In the link unix.stackexchange.com/a/384187/61742 we have complete information about what was suggested by @Danatela . Thanks! – Eduardo Lucio Aug 5 '17 at 20:06
  • 1
    @EduardoLucio please give credits to Long Bui. I just edited this post to make it more readable. – Danatela Aug 7 '17 at 10:38
  • @Long Bui Thank you for your contribution! Up! Up! Up! Up! Up! Up! =D – Eduardo Lucio Aug 7 '17 at 13:36
11

Network configuration has changed in Ubuntu 17.10.1. You now use the netplan config.

I followed this guide here

As a migration of Christian's answer, do the following:

Create a new config file inside of /etc/netplan to hold your host-only adapter config.

e.g sudo nano /etc/netplan/02-netcfg.yaml

Enter the following to configure a static IP of 192.168.56.12 where enp0s3 is the name of your host-only adapter.

network:
    version: 2
    renderer: networkd
    ethernets:
        enp0s3:
            addresses:
                - 192.168.56.12/24
            dhcp4: no

Then run the following two commands:

sudo netplan generate
sudo netplan apply

NAT should work without configuration, run ifconfig to see the result:

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
  • 1
    Thanks! I added an update section to my old answer and linked to this new info. – Christian Long Mar 9 '18 at 22:57
  • I have followed you solution, but miss nat support for enp0s8. I have manually added enable dhcp4 for enp0s8 in netplan and finally get both enp0s3 and enp0s8 up. Hope this will help somebody. – Dzmitry Prakapenka Nov 13 '18 at 13:50
2

I Just added 2 adapters:

Adapter 1 host only, vboxnet0

Adapter2 NAT

And it works perfect, I can access the virtual machine from the host, and I have internet on the vm.

1

Yeah I had this problem it was a total pain! But I solved it by simply installing Squid Cache Proxy server on my physical PC, and that way - my host-only internet virtualbox PCs could connect to the internet !

I did a quick 3 minute guide here - for anyone who want's to how it works ! http://b0zmeister.wordpress.com/allowing-host-only-virtualbox-guest-to-connect-to-the-internet/

  • That worked great for me, thanks for sharing. It's by far the simplest way to get it all working. – laurent Dec 28 '13 at 11:22
  • Hi Laurent - no problems - glad it helped! Gotta love running the virtualbox PCs off a different network - but - with internet connection working :) – B0zmeister Jan 4 '14 at 18:32
  • The link is dead now. Consider moving the instructions here. – s3v3n Mar 21 '18 at 20:37

protected by Community Mar 15 '16 at 11:23

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.