Additional network interfaces

[since version 1.6.0]

Multipass can launch instances with additional network interfaces, via the --network option. That is complemented by the networks command, to find available host networks to bridge with.

This is supported only for images with cloud-init support for Version 2 network config, which in turn requires netplan to be installed. So, from 17.10 and core 16 onward, except for snapcraft:core16. And then only in the following scenarios:

Network specification

The --network option can be given multiple times, each one requesting an additional network interface (beyond the default one, which is always present). Each use takes an argument specifying the properties of the desired interface:

  • id — the only required value, it identifies the host network to connect the instance’s device to (see networks for possible values)
  • mode — either auto (the default) or manual; with auto, the instance will attempt automatic network configuration
  • mac — a custom MAC address to use for the device

These properties can be specified in the format <key>=<value>,…. but a simpler form with only <id> is available for the most common use-case. Here is an example:

$ multipass launch --network en0 --network id=bridge0,mode=manual
Launched: upbeat-whipsnake

$ multipass exec upbeat-whipsnake -- ip -br address show scope global
enp0s3           UP             10.0.2.15/24
enp0s8           UP             192.168.1.146/24
enp0s9           DOWN

$ ping -c1 192.168.1.146  # elsewhere in the same network
PING 192.168.1.146 (192.168.1.146): 56 data bytes
64 bytes from 192.168.1.146: icmp_seq=0 ttl=64 time=0.378 ms
[...]

In the example above, we got the following interfaces inside the instance:

  • enp0s3 — the default interface, that the instance can use to reach the outside world and which Multipass uses to communicate with the instance;
  • enp0s8 — the interface that is connected to en0 on the host and which is automatically configured;
  • enp0s9 — the interface that is connected to bridge0 on the host, ready for manual configuration.

Routing

Extra interfaces are configured with a higher metric (200) than the default one (100). So, by default the instance will only route through them if they’re a better match for the destination IP:

$ multipass exec upbeat-whipsnake -- ip route
default via 10.0.2.2 dev enp0s3 proto dhcp src 10.0.2.15 metric 100
default via 192.168.1.1 dev enp0s8 proto dhcp src 192.168.1.146 metric 200
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15
10.0.2.2 dev enp0s3 proto dhcp scope link src 10.0.2.15 metric 100
192.168.1.0/24 dev enp0s8 proto kernel scope link src 192.168.1.146
192.168.1.1 dev enp0s8 proto dhcp scope link src 192.168.1.146 metric 200

$ multipass exec upbeat-whipsnake -- ip route get 91.189.88.181
91.189.88.181 via 10.0.2.2 dev enp0s3 src 10.0.2.15 uid 1000
    cache

$ multipass exec upbeat-whipsnake -- ip route get 192.168.1.13
192.168.1.13 dev enp0s8 src 192.168.1.146 uid 1000
    cache

I’m excited about --network option. My setup is Windows 10 machine with Hyper-V enabled. Currently, whenever I start a VM using Multipass it attaches to a private network, and when I change that to an external network I cannot open the shell again. When will version 1.6.0 be released? Do I have to wait for the release or is there another way to accomplish changing the default network?

Thank you for your efforts,
Burak

I’ve played with the rc on Windows 10 Pro a bit.

I love where this is going, but I noticed two things that need to be addressed in documentation.

  1. When adding network interfaces using the new option, this is ON TOP OF the always implicitly created default interface. The documentation does not clarify this. E.g. when adding two interfaces with --network, the VM ends up with three interfaces, like in the example. It’s easy to overlook in the example, so adding a sentence explaining that the default interface is always there implicitly is worth the effort.

  2. I know how to pass a user-data.yml for cloud-init. How do I pass the network configuration which in cloud-init goes into a separate file? I see two improvement options here:

a) add more key=value properties to --network to allow for specifying what goes into netplan for manual config, with multipass generating the network config file for cloud-init from that.

b) add an additional command line option to multipass that allows to pass the cloud-init network config file.

Did I miss anything?

thanks for all the work on this, it’s getting more useful release by release.

Tobias

Hi @polarapfel, thanks for the feedback. I have added a sentence to emphasize that the “additional network interfaces” are added on top of the default one.

As for the special network configurations, there is a balance to be struck between how much functionality we provide and simplicity of use, which is one of the features we aim for with Multipass. That said, we offer a way for manual network configuration that you can use to customize to your liking (e.g. via netplan inside). We’re also tracking a couple of issues related to this.