Linux QEMU のブリッジ ネットワーク インターフェイスの問題

Linux QEMU のブリッジ ネットワーク インターフェイスの問題

CentOS 7で実行しているQEMUの1つにブリッジインターフェースを設定しようとしています。TAPインターフェースを実行するための以下のスクリプトがあります。

$ 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

QEMUマシンを実行する前に、このスクリプトを実行して、ブリッジインターフェースを起動できるようにします。他のホストからこのインターフェースにpingを実行できます。以下は出力です。

$ 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

以下は他のホスト、つまり192.168.42.12からのpingの出力です。

# 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

以下は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 "

また、iptables を停止し、QEMU マシン (192.168.42.202) または他のホストからホストに ping を試みましたが、到達できません。

# 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

この問題を解決するためのアイデアはありますか。

答え1

最終的に、OpenVPN トンネル メカニズムを使用してこの問題を解決することができました。参考までに、解決策を示します。これは解決策の 1 つであり、他にも解決策がある可能性があります。

  1. Epel RPM をインストールし、次に openvpn パッケージをインストールしますyum install openvpn
  2. 次に、サンプルの bridge-start スクリプト (にあります/usr/share/doc/openvpn<version>/sample-scripts) を以下のように変更します。
#!/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. 同様に、ブリッジ停止スクリプトがあります。これを使用して、タップデバイスとブリッジを削除できます。

  2. これを実行可能にして、./bridge-start として実行します。実行する前に、Qemu を起動します。

  3. ここで、TAP デバイスを使用して Qemu を起動しますtap0。他のホストやデバイスと通信できるようになります。

詳細については、OpenVPN イーサネット ブリッジ ネットワーク

関連情報