ゲストとホストがlinux-kvmとmacvtapを使用してお互いを認識できない


9

kvm仮想マシンを古いホスト(ハードウェアとOSの両方)から新しいホストに移行しています。

ネットワーキングに関して、virt-managerはmacvtapという新しいオプションを提案しました。これは、eth0にブリッジを設定するのに適した代替手段のように見えました。

これで、ゲストは正常に起動し、ローカルネットワークのDHCPサーバーからIPを取得し、インターネットに到達できます。ゲストはローカルネットワーク上の他のマシンも表示し、それらをsshなどで確認できます。

問題は、ホストとゲストがお互いを見ないことです。ゲストIPを使用してホストからゲストに到達できず、ホストIPを使用してゲストからホストに到達できません。ping、ssh、http、何もしません。

これroute -nがホストからのコマンドです:

$ /sbin/route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

(ゲストからの同じ出力)。

ホストとゲスト間の通信専用の新しいtun / tapインターフェースをセットアップすることもできますが、少しやり過ぎに見えます。ホストとゲストを通信させる方法はありますか?


Macvtapはブリッジングの有効な代替品ではありません。ブリッジではなく切り替えが必要な場合は、openvswitchを調べてください。
user186658 2016

回答:


7

IRCでこの質問をしたところ、macvtap

ゲストトラフィックをネットワークスタックに注入し、そのためには低すぎます

解決策は、ゲストとホストが通信するためのネットワークインターフェースを追加するか、または古いブリッジソリューションを維持することです...


1
ネットワークマネージャーを無効にすることなくホスト/ゲストインターフェースを作成する方法の詳細な手順は次のとおり
page

1
これらの指示を機能させることができませんでした...
HDave

4

virt-managerは、macvtapは、セットアップ時にホストからゲストへのネットワーク通信では機能しないと明示的に言っています。私は単に2番目のnatベースのインターフェースを追加し、それをゲストにセットアップし、それを使用してホストと通信しました。


1

解決策は、ハイパーバイザーにmacvlanインターフェースを構成し、実際のハードウェアインターフェースと同じIPアドレスを使用して(非常に重要)、それを使用するようにホストにルーティングを構成することです。Qemu / KVMでは、通常どおりハードウェアインターフェイスでmacvtapインターフェイスを使用します。

私の構成(192.168.1.0/24ネットワーク、p10p1ハードウェアインターフェイス、および192.168.1.1ゲートウェイ)の場合、(ハイパーバイザーで)次のようになります。

ip link add link p10p1 address 00:19:d1:29:d2:58 macvlan0 type macvlan mode bridge
ip address add 192.168.1.100/24 dev macvlan0
ip link set dev macvlan0 up

ip route flush dev p10p1
ip route add default via 192.168.1.1 dev macvlan0 proto static

1

以前の回答で述べたように、この問題の解決策は、ホストにmacvlanネットワークアダプターを追加することです。ただし、特にIPv6のサポートが必要で、プレフィックスが変更されたときにルートを手動で設定すると問題が発生する可能性があったため、macvlanアダプターへのルートを手動で再配線するのはちょっと面倒だと感じました。カーネルがルーティングテーブルの制御下に置かれる私の構成は次のとおりです。

(ここでの特定の構成はDebianおよびUpstart固有ですが、基本的な手順はすべてのGNU / Linuxで機能するはずです。)

起動時にmacvlanアダプターを作成する

最初に、アダプターのMACアドレスを選択する必要があります。ランダムに使用できる場合もありますが、手動でmacvlanアダプターを作成し、そのMACを使用することをお勧めします。このようにして、MACはそこに存在する可能性のあるすべての規則に従います。

固定MACを設定することをお勧めします。そうしないと、たとえばDHCPサーバーが再起動後にマシンを認識し、以前と同じIPアドレスを割り当てる方法がないためです。

アダプターを作成してMACを調べます。

root@host:~# ip link add link eth0 macvlan0 type macvlan mode bridge
root@host:~# ip addr show dev macvlan0
#: macvlan0@eth0:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
    link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff
...

強調表示されている16進数はMACアドレスです。

今度は、起動のたびにmacvlanアダプターを作成するため、ネットワークが初期化される前に実行する必要がある初期化スクリプトを作成します。これを行うコマンドは次のとおりです。

ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge

この目的のためのサンプルUpstart initスクリプトは次のようになります。

start on starting networking

script
    ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge
end script

これを例えばに入れてください/etc/init/macvlan.conf

ネットワーク構成のセットアップ

/etc/network/interfaces、物理ネットワークアダプターを手動(ただし、自動のまま)に設定し、以前の構成(通常はDHCPまたは静的IPアドレス)をmacvlanアダプターに移動します。例えば:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

物理アダプターのIPv6の無効化

最後に、物理アダプターがIPアドレスを取得しないようにします。IPv4の場合、アダプターを手動に設定すると、アドレスを取得できなくなります。ただし、カーネルがアダプターのIPv6アドレスを取得/割り当てできないようにする構成は見つかりませんでした。その場合、ルートも追加するため、問題が発生する可能性があります。したがって、最善の方法は、物理アダプターのIPv6を無効にすることです。あなたは行を追加することでこれを行うことができます

net.ipv6.conf.eth0.disable_ipv6=1

to /etc/sysctl.conf/etc/sysctl.d/この行でファイルを作成するか、または

sysctl -w net.ipv6.conf.eth0.disable_ipv6=1

あなたのinitスクリプトに。

マシンを再起動すると、ホストからゲストへの通信はIPv4とIPv6の両方で機能するはずです。


この設定を間違えると、再起動後もネットワーク経由でホストにアクセスできなくなる可能性があることに注意してください。これを行うのは、マシンに物理的にアクセスできる場合や、潜在的な問題を修正できるように他の保護手段が整っている場合のみです。


1

あなたはこのようなもので終わりたいと思います:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 macvlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 macvlan0

最後の列には「eth0」ではなく「macvlan0」が含まれていることに注意してください。

これを実現するには、IPアドレスとして192.168.0.42を想定して、次のコマンドを使用できます。

ip link add link eth0 macvlan0 type macvlan mode bridge
ip address add 192.168.0.42 dev macvlan0
ip link set dev macvlan0 up
ip route flush dev eth0
ip route add default via 192.168.0.1

ほとんどnpenのソリューションに似ています。より洗練されたスクリプトが必要な場合は、この件に関する私のWebページを参照してください


ロードすることを忘れないでくださいmacvlanモジュールを:modprobe macvlan
MDD

0

LazzaroがDebianで書いたものを使用しましたが、いくつかのメモを追加したいと思います。

まず、ゲストインターフェイスを「ソースデバイス」->「ホストデバイスeth0:macvtap」に設定する必要があります。「ソースモード」->「ブリッジ」。

第二に、あなたが私のために機能しなかったinitスクリプト(macvlan0インターフェイスが起動時に遅すぎるように作成されたようです)なので、これを使用しました:

nano /etc/init.d/macvlan

Macを、インターフェイスが最初に作成されたときに割り当てられたものに変更します。

#!/bin/sh
### BEGIN INIT INFO
# Provides:          macvlan
# Required-Start:    $local_fs
# Required-Stop:     
# Default-Start:     S
# Default-Stop:      
# Short-Description: Set up macvlan
# Description:       This script sets up the macvlan interface
#                    before it can be used by networking.
# X-Start-Before:    networking
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh


do_start () {
        ip link add link eth0 address 00:11:22:aa:bb:cc macvlan0 type macvlan mode bridge
###      REPLACE MAC ON EACH HOST ->  ^^ ^^ ^^ ^^ ^^ ^^
}

case "$1" in
  start|"")
        do_start
        ;;
  *)
        echo "Sorry, this only sets up the macvlan interface." >&2
        exit 3
        ;;
esac

実行ビットを保存して設定します。

chmod +x /etc/init.d/macvlan

initのすべてのリンクを追加します。

update-rc.d macvlan defaults
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.