For a long time, I’ve been very much annoyed by network setups on virtual machines. Either you choose a bridge interface (which is very easy with something like Virtualbox), or you choose NAT. The issue with NAT is that you can’t easily get into your VM (for example, virtualbox doesn’t exposes the gateway to your VM). With bridging, you’re getting in trouble because your VM will attempt to get DHCP from the outside network, which means that first, you’ll get a different IP depending on where your laptop runs, and second, the external server may refuse your VM because it’s not authenticated (for example because of a MAC address filter, or 802.11x auth).
But there’s a solution to it. I’m now very happy with my network setup, which is using a dummy network interface. Let me share how it works.
In the modern Linux kernel, there’s “fake” network interface through a module called “dummy”. To add such an interface, simply load the kernel module (ie: “modprobe dummy”) and start playing. Then you can bridge that interface, and tap it, then plug your VM to it. Since the dummy interface is really living in your computer, you do have access to this internal network with a route to it.
I’m using this setup for connecting both KVM and Virtualbox VMs, you can even mix both. For Virtualbox, simply use the dropdown list for the bridge. For KVM, use something like this in the command line: -device e1000,netdev=net0,mac=08:00:27:06:CF:CF -netdev tap,id=net0,ifname=mytap0,script=no,downscript=no
Here’s a simple script to set that up, with on top, masquerading for both ip4 and ipv6:
# Load the dummy interface module modprobe dummy # Create a dummy interface called mynic0 ip link set name mynic0 dev dummy0 # Set its MAC address ifconfig mynic0 hw ether 00:22:22:dd:ee:ff # Add a tap device ip tuntap add dev mytap0 mode tap user root # Create a bridge, and bridge to it mynic0 and mytap0 brctl addbr mybr0 brctl addif mybr0 mynic0 brctl addif mybr0 mytap0 # Set an IP addresses to the bridge ifconfig mybr0 192.168.100.1 netmask 255.255.255.0 up ip addr add fd5d:12c9:2201:1::1/24 dev mybr0 # Make sure all interfaces are up ip link set mybr0 up ip link set mynic0 up ip link set mytap0 up # Set basic masquerading for both ipv4 and 6 iptables -I FORWARD -j ACCEPT iptables -t nat -I POSTROUTING -s 192.168.100.0/24 -j MASQUERADE ip6tables -I FORWARD -j ACCEPT ip6tables -t nat -I POSTROUTING -s fd5d:12c9:2201:1::/64 -j MASQUERADE