
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 つであり、他にも解決策がある可能性があります。
- Epel RPM をインストールし、次に openvpn パッケージをインストールします
yum install openvpn
。 - 次に、サンプルの 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
同様に、ブリッジ停止スクリプトがあります。これを使用して、タップデバイスとブリッジを削除できます。
これを実行可能にして、./bridge-start として実行します。実行する前に、Qemu を起動します。
ここで、TAP デバイスを使用して Qemu を起動します
tap0
。他のホストやデバイスと通信できるようになります。
詳細については、OpenVPN イーサネット ブリッジ ネットワーク