web-dev-qa-db-ja.com

ゲストとホストは、linux-kvmとmacvtapを使用してお互いを見ることができません

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インターフェースをセットアップすることもできますが、少しやり過ぎに見えます。ホストとゲストを通信させる方法はありますか?

9
ascobol

IRCでこの質問をしましたが、macvtapのようです

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

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

7
ascobol

virt-managerは、macvtapを設定すると、ホストからゲストへのネットワーク通信では機能しないことを明示的に示しています。 2つ目のnatベースのインターフェイスを追加し、それをゲストに設定し、それを使用してホストと通信するだけです。

4
Journeyman Geek

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

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

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

まず、アダプタのMACアドレスを選択する必要があります。ランダムなものだけを使用できる場合もありますが、手動でmacvlanアダプターを作成し、そのMACを使用することをお勧めします。このように、MACはそこにあるかもしれないあらゆる慣習を義務付けています。

固定MACを設定することをお勧めします。再起動後にマシンを認識し、以前と同じIPアドレスを割り当てるDHCPサーバー。

アダプターを作成して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アドレスです。

ここで、initスクリプトを作成します。これは実行する必要があります前にネットワークが初期化されます-起動するたびに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を無効にする

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

net.ipv6.conf.eth0.disable_ipv6=1

/etc/sysctl.confにこの行を使用してファイルを作成するか、追加することにより、/etc/sysctl.d/

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

initスクリプトに。

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


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

1
Lazzaro

解決策は、ハイパーバイザーで実際のハードウェアインターフェイスと同じIPアドレス(非常に重要)を使用してmacvlanインターフェイスを構成し、それを使用するようにホストでルーティングを構成することです。 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
npen

あなたは次のようなものになりたいです:

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のソリューションに似ています。より洗練されたスクリプトが必要な場合は、このテーマについて私の webpage を参照してください。

1
Evert Mouw

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
0
Nick Name