Skip to main content

QEMU Networking

qemu-system-x86_64 -nic model=help
qemu-system-x86_64 -netdev ?

User Networking (SLIRP)

Default, easiest, no root required. Slower.

# Forward host 8080 to guest 80
-netdev user,id=mynet0,hostfwd=tcp::8080-:80 -device e1000,netdev=mynet0

TAP Networking

Requires root/capabilities. High performance.

# Basic TAP
-netdev tap,id=net0,script=no,downscript=no,ifname=tap0 \
-device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:56

Setup TAP/Bridge

modprobe tun tap
ip link add br0 type bridge
ip tuntap add dev tap0 mode tap
ip link set dev tap0 master br0
ip link set dev eth0 master br0
ip link set dev br0 up

MacVTap

Combines tun/tap and bridge.

sudo ip link add link eth1 name macvtap0 type macvtap mode bridge
sudo ip link set macvtap0 address 1a:46:0b:ca:bc:7b up
sudo ip link show macvtap0

# Launch QEMU with MacVTap (using file descriptors)
# Requires getting tap fd index
-netdev tap,id=net0,script=no,downscript=no,ifname=tap$(< /sys/class/net/macvtap0/ifindex) \
-device virtio-net-pci,netdev=net0,mac=$(< /sys/class/net/macvtap0/address)

Bridge Helper

# Allow bridge
echo 'allow virbr0' >> /etc/qemu/bridge.conf

-netdev bridge,id=net0,br=virbr0 -device virtio-net,netdev=net0

VDE (Virtual Distributed Ethernet)

vde_switch -tap tap0 -daemon -mod 660 -group users
ip link set tap0 up

Tuning

# Enable IP Forwarding
sysctl net.ipv4.ip_forward=1
sysctl net.ipv4.conf.all.proxy_arp=1