QEMU-ブリッジ

QEMU-ブリッジ

QEMU(およびKVM)を使用してDebian 9に仮想マシンを設定しています。現在、etcを使用して設定されたブリッジネットワークを介して機能しようとしています。ip link結果ip tuntapは次のとおりですbrctl show

bridge name     bridge id               STP enabled     interfaces
br0             8000.107b444f55d6       no              enp4s0
                                                        tap0
docker0         8000.0242d4c18983       no

出力は次のとおりですip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 10:7b:44:4f:55:d6 brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:d4:c1:89:83 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
4: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
    link/ether f6:54:bb:db:d7:c6 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::f454:bbff:fedb:d7c6/64 scope link
       valid_lft forever preferred_lft forever
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 10:7b:44:4f:55:d6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.26/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::127b:44ff:fe4f:55d6/64 scope link
       valid_lft forever preferred_lft forever

インターフェイスはdocker0それとは何の関係もありません。

私が知っている限り、これはうまくいくはずです。ただし、QEMUのWindows 8.1クライアントはインターネットにアクセスできず、DHCPを介してIPを取得できません(自動生成された169.xx.xx.xx IPのみを取得します)。

なぜそうなのかよく分からない。私のQEMUパラメータは次のとおりです。

-net nic -net tap,ifname=tap0

私も次のことを試しました。

-device e1000,netdev=net0,mac=52:55:00:d1:55:01 -netdev tap,id=net0

どちらもネットワークにアクセスできないという同じ結果を生成します。私はこれを見つけることができません。

私が愚かなことをしているのだろうか?

答え1

QEMU Linuxゲストで非常に似た問題が発生し、iptablesがトラフィックをブロックしていることがわかりました。ゲストに静的IPアドレスを設定すると、ホストとゲストは互いにpingできますが、それはすべてです。ゲストコンピュータはインターネットと残りのネットワークにアクセスできません。

問題を調査するには、Wiresharkやtcpdumpなどのツールを使用することをお勧めします。

Wiresharkを使用してホストコンピュータからブリッジインターフェイスをキャプチャしましたが、要求は仮想マシンから来ているように見えますが、応答は受信されません。

ここに画像の説明を入力してください。

重要な要約:この手がかりは次の答えのMagic iptableコマンドにつながりました(私はiptablesの経験があまりないので、私にとっては魔法です:)):

https://serverfault.com/a/165786

うまくいき、今は完全に理解できなくてもここに2セントを残しておくと思いました。

頑張ってください!

答え2

私も現在この問題で悩んでいます。私はあなたよりも解決策に近いです。

私はDebian 10を使用しており、カーネルの一部であり、すべてのLinuxで利用可能なパッケージiproute2ip link、、ip addr...)を使用することにしました。bridge linkそしてパッケージqemu-kvm。それはあなたが必要とするすべてです。




ステップ1

開いているターミナル1そして、進捗状況を確認できるように記録してみてください。

while true; do ip addr; sleep 1; clear; done



ステップ2

開いているターミナル2進行状況を見ながら、次のコマンドを実行します。ターミナル1:

sudo ip link add virtual_bridge type bridge
sudo ip link set virtual_bridge up

あなたは足を持っていますup




続行する前に試してみてください。

あなたvirtual_bridgeは現在ですが、upイーサネットカードはupまたはかもしれませんdown。今、試行錯誤で見つけた2つのシナリオを読んでください。これは非常に重要です(!)これにより、イーサネットカードがどのように反応するかがわかります。試してみたり、試したりすることはできませんが、視聴しながら以下の説明に正確に従うことをお勧めします。ターミナル1変える。

シーン1:

イーサネットカードがある場合は、down次のコマンドを使用してカードをマスターデバイスに割り当ててみてください。働きます:

sudo ip link set enx24f5a2f17b27 master virtual_bridge

今開いてみてください。

sudo ip link set enx24f5a2f17b27 up

カードでインターネットに接続できないことを知っていると驚きます。再起動しても成功しません。

sudo ip link set enx24f5a2f17b27 down
sudo ip link set enx24f5a2f17b27 up

ブリッジを再起動してもブリッジを制御する必要があるカード所有者は、次のことを行いません。

sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up

インターネットに接続する唯一の方法は、カードを再起動し、メインカードを削除し、更新してすべてのIPを削除することでした。(たぶん必要ないかもしれません)、既知の動作IPを手動で割り当て、マスターを割り当てます。

sudo ip link set enx24f5a2f17b27 down
sudo ip link set enx24f5a2f17b27 up
sudo ip addr flush enx24f5a2f17b27
sudo ip addr add 192.168.64.100/24 dev enx24f5a2f17b27
sudo ip link set enx24f5a2f17b27 master virtual_bridge

この時点でインターネットが機能し始める必要があります。

シナリオB:

イーサネットカードにupIPがあり、インターネットが正常に動作している場合です。次に、以下のコマンドを使用してホストを割り当ててみます。動作します!

sudo ip link set enx24f5a2f17b27 master virtual_bridge

ブリッジを数回リセットし、カードに何が起こっているかを確認してください。

sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up
sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up

ブリッジイーサネットカードを有効にするたびに、カードも有効になり、IPを取得してインターネットに接続していることがわかります。ただし、カードを閉じると、次のような状況が発生します。

sudo ip link set enx24f5a2f17b27 down

ブリッジを数回リセットしてもインターネットに再接続できません。

だから最も重要なのはまさにあなたです。最初イーサネットカードの電源を入れて第二他の方法ではなく基本として指定してください!つまり、マスターを割り当てるときにカードを有効にする必要があります。




ステップ3

上記の例からわかるように、まず(!)イーサネットカードの電源を入れるとIPが得られます。

sudo ip link set enx24f5a2f17b27 up

次に、ここにマスターを割り当てます。

sudo ip link set enx24f5a2f17b27 master virtual_bridge

仮想マシン用の仮想イーサネットカードのように機能するTAPデバイスを作成します。それは重要です(!)それ以外の場合は、適切な権限がない可能性があるため、auserとaを割り当てます。group

sudo ip tuntap add virtual_tap mode tap user ziga group ziga

これで、これを作成したので有効にしようとすることができますが、仮想マシンだけがこれを実行できるため、成功しません。

sudo ip link set virtual_tap up

downだからその状態のままです。ここでもマスターを適用するだけです。

sudo ip link set virtual_tap master virtual_bridge

これでネットワーク設定が完了します。現在、お客様のTAPデバイスにIPはありません。仮想マシンを起動し、仮想マシンが独自に設定されるのを待つと割り当てられます。




ステップ4

これで、仮想マシンを正しく起動するようになりました。私は最新のコマンドで行います-nic。コマンドは短くて強力です。(!)前のコマンドより(読む)。とにかく...私は次のコマンドを使用します:

qemu-system-x86_64 -enable-kvm -cpu host -smp cores=3,threads=1 -m 4096 -nic tap,ifname=virtual_tap,script=no,downscript=no -boot order=c -cdrom ~/Dropbox/workspace/racunalnistvo/programi/kvm/iso/centos-8.1.1911-x86_64-dvd1.iso -drive file=~/Dropbox/workspace/racunalnistvo/programi/kvm/vm/windows.qcow2,format=qcow2

script=no オプションを省略すると、downscript=no上記のコマンドは無害な警告を返します。

RTNETLINK answers: Operation not permitted
W: /etc/qemu-ifup: no bridge for guest interface found

これは、エミュレーション前にQemuがスクリプトを使用して独自のブリッジとTAPを自動的に設定しようとしたためです/etc/qemu-ifup。スクリプトが完了したら、ブリッジとTAPの削除も試みます /etc/qemu-ifdown。このスクリプトを見ると、私がインストールしていないパッケージの一部であるコマンドを使用し、スクリプトが失敗することが brctlわかります。bridge-utils

とにかく、ブリッジとTAPデバイスを手動で作成したため、これらのスクリプトは必要なく、Qemuがscript=noそれを使用して呼び出すのを防ぎますdownscript=no

iproute2 代わりに使用するためにこれらのスクリプトを書き換えるのは楽しいですが、それを実行するには権限がbridge-utils必要であり、root専門家は仮想マシンをroot

仮想マシンが起動してインターネットに接続しますが、ホストをpingすることはできません!また、ホストはインターネットに接続し、同じゲートウェイをpingできます。しかし、仮想マシンをpingすることはできません!

また注ターミナル1ここでは、TAPデバイスが有効になっていてIPが付与されていることがわかります。ただし、このIPは仮想マシンの内部に表示されるIPとは異なります。誰でもこれを説明できますか?




太陽

これが私が見つけたものです。誰かに役立つことを願っています。 TAPデバイスにはTCP、UDP、およびICMPが有効になっている必要がありますが、なぜホストとVMが互いにpingできないのかはまだわかりません...何とかブリッジにIPを割り当てる必要があるためです(読む読む)しかし、正しいものを選ぶ方法がわかりません。誰でもコメントを提示できますか?

関連情報