By default QEMU makes it very easy to connect a virtual machine to the Internet using the user mode network with -netdev user. However, I’m using a custom configuration that connects my virtual machines to a pfsense instance so I needed to add an extra bridge for host to guest communication.
You can create a local bridge and tap pair on the host by using the iproute2 set of tools.
# ip link add dev bridge00 type bridge
# ip tuntap add tap00 mode tap user $USER group kvm
# ip link set tap00 master bridge00
# ip link set dev bridge00 up
# ip link set dev tap00 up
Now for most use cases, there’s no need to set up some fancy DHCP server on the host to serve a single client so I configure a simple static configuration and add that associated configuration in the guest’s equivalent to rc.local
.
(host) # ip addr add 192.168.123.1/24 broadcast 192.168.123.255 dev bridge00
Inside the guest you can give yourself a static IP and communicate to the host like so.
(guest) # ip addr add 192.168.123.2/24 dev ens1
Finally, UP the interface in the guest.
# ip link set dev ens1 up
Now you should be able to SSH or ping the guest on this private network with the virtual machine.