Linux QEMU issue with bridge network interface

centos7qemu

I am trying to setup a bridge interface for one of my QEMU running on CentOS 7. I have below scripts for TAP interface running

$ cat /etc/qemu-ifup
ifconfig ens192 down
ifconfig ens192 0.0.0.0 promisc up
openvpn --mktun --dev tap0
ifconfig tap0 0.0.0.0 up
brctl addbr br0
brctl addif br0 ens192
brctl addif br0 tap0
brctl stp br0 off
ifconfig br0 192.168.42.201 netmask 255.255.255.0

Now before running QEMU machine I run this script so that we can have bridged interface up and running. I am able to ping this interface from other host. Below is the output

$ ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.42.201  netmask 255.255.255.0  broadcast 192.168.42.255
        inet6 fe80::646a:f6ff:fe1e:42ce  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:1f:e0:db  txqueuelen 0  (Ethernet)
        RX packets 314  bytes 15522 (15.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38  bytes 4803 (4.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ens192: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        ether 00:0c:29:1f:e0:db  txqueuelen 1000  (Ethernet)
        RX packets 258  bytes 16020 (15.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 92  bytes 8269 (8.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 7404  bytes 108578604 (103.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7404  bytes 108578604 (103.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tap0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::e8d9:3ff:fedf:85d3  prefixlen 64  scopeid 0x20<link>
        ether ea:d9:03:df:85:d3  txqueuelen 100  (Ethernet)
        RX packets 69  bytes 4722 (4.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 193  bytes 12111 (11.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 02:a1:9f:a4:81:bc  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1  bytes 90 (90.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Below is the output of ping from other host i.e. 192.168.42.12

# ping 192.168.42.201
PING 192.168.42.201 (192.168.42.201) 56(84) bytes of data.
64 bytes from 192.168.42.201: icmp_seq=1 ttl=64 time=1.19 ms
64 bytes from 192.168.42.201: icmp_seq=2 ttl=64 time=0.369 ms

Now below is the command which I fired for running QEMU

/home/test/yocto/poky/build/tmp/sysroots/x86_64-linux/usr/bin/qemu-system-arm -kernel /home/test/yocto/poky/build/tmp/deploy/images/qemuarm/zImage-qemuarm.bin -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=no,downscript=no -M versatilepb -hda /home/test/yocto/poky/build/tmp/deploy/images/qemuarm/core-image-minimal-dev-qemuarm-20141124054625.rootfs.ext3 -no-reboot -show-cursor -usb -usbdevice wacom-tablet -no-reboot -m 128 --append "root=/dev/sda rw console=ttyAMA0,115200 console=tty mem=128M highres=off "

Also I have stop iptables and tried to ping host from QEMU machine (192.168.42.202) or from other host but I am not able to reach it.

# ping 192.168.42.202
PING 192.168.42.202 (192.168.42.202) 56(84) bytes of data.
^C
--- 192.168.42.202 ping statistics ---
670 packets transmitted, 0 received, 100% packet loss, time 669735ms

So any thoughts to fix this issue.

Best Answer

Finally I was able to solve this issue through OpenVPN tunnel mechanism. So for reference I am putting the solution. This could be one of it as there could be more.

  1. Install Epel RPM and then install openvpn package as yum install openvpn.
  2. Now modify the sample bridge-start script (can be found in /usr/share/doc/openvpn<version>/sample-scripts) as below:
#!/bin/bash

# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0" #<== Change it with your physical ethernet device.

eth_ip="192.168.8.4/24" #<== Update this with the address which you want to use it.

# create the bridge interface, assign the ip address for it, and enable
ip link add name $br type bridge
ip address add $eth_ip dev $br
ip link set dev $br up

# add eth interface into the bridge
ip link set dev $eth master $br
ip link set dev $eth up

# create the tap interfaces and add they into the bridge
for t in $tap; do
    openvpn --mktun --dev $t
    ip link set dev $t master $br
    ip link set dev $t up
done

exit 0
  1. Similiary there is bridge-stop script. It can be used to remove tap device and bridge.

  2. Now make it executable and run as ./bridge-start. Before running the start Qemu.

  3. Now start the Qemu with TAP device i.e. tap0. It will be able to communicate with other hosts and devices.

For more information take a look to OpenVPN Ethernet Bridge Networking