ホストはブリッジデバイスからIPを取得しますが、virt-manager仮想マシンはIPを取得しません。

ホストはブリッジデバイスからIPを取得しますが、virt-manager仮想マシンはIPを取得しません。

まず、私の質問は次のとおりです。Virt-Manager(KVM)を使用して仮想マシンとホストとブリッジされたネットワークを設定するには?しかし、表示された答えは私にはうまくいかず、質問が解決済みとしてマークされているので、新しい質問を投稿するのが最善だと思いました。

設定を簡素化しようとしています。

  • 私は(Debian + KDEを実行)hostを持っています。eno1
  • eno1すべてのインターフェイスを削除しました
  • ブリッジインターフェイスを作成し、スレーブインターフェイスとしてbr0追加しました。eno1
  • virt-managerをインストールしましたhost

今:

  • hostに接続しbr0するIPを取得
  • virt-managerはVM使用するように設定されていbr0ますが、しないでくださいIPを取得

どんなに努力してもVMIPを取得できません。この問題をどのように解決できますか?

以下はいくつかのスクリーンショットです。 br1は私がプレイ/テスト中なので無視してください。

接続するbr0...

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

...イーサネットスレーブ付き...

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

...次に接続eno1

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

VMブリッジデバイスとして構成br0

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

ベストアンサー1

ドッカーを使うiptablesこれを管理するコンテナライブラリ仮想マシンそれも使用してください。しかし、通常、Dockerは、次の2つの理由で同じシステム上で実行されている他のネットワーク関連ツールとはうまく機能しません。

これらの組み合わせと事実br_netfilterこれをデフォルトの動作に設定、Dockerに関係なく、システムに存在するすべてのブリッジはデフォルトのDROP転送ポリシーを継承します。iptables、除外ebtables存在する場合でもこれを行うことができます。渡されたフレームはすべて削除されます。

だから、すべての足は次のように作られています。ライブラリ仮想マシン影響を受ける:Dockerを実行すると、仮想マシンが隔離されます。上記のように、Dockerによって生成された接続ルールに例外を追加できます(ただし、実際には追加するのではなく挿入する必要があります)DOCKER-USER(必要に応じて管理者が最初に生成できます)。 Dockerは常にルールを最初に挿入するため、チェーンにルールを追加するだけでFORWARDは不十分ですDOCKER-USER

Docker以外のブリッジがフィルタリングされないようにするiptables、次のいずれかのオプションを使用できます。

  1. IPアドレスへの転送が許可されているものと一致します。 0.0.0.0、255.255.255.255などのアドレスを使用することはDHCPと区別するのが難しいため、追加する必要があります。 IP LAN 192.0.2.0/24の場合:

    iptables -N DOCKER-USER || true # doesn't matter if done before Docker or after (and thus already existing)
    iptables -I DOCKER-USER -s 192.0.2.0/24 -d 192.0.2.0/24 -j ACCEPT
    iptables -I DOCKER-USER -s 0.0.0.0/32 -d 255.255.255.255/32 -j ACCEPT
    
  2. またはDocker以外のインターフェースを介して一致

    docker0Dockerインターフェイスは、常に名前が付けられているか、命名をカスタマイズしない限り指定されますbr-...。同じ命名規則を使用しないで、例外を追加してください。

    ~からiptablesブリッジポートから転送されたブリッジフレーム1番例えば仮想ネットワーク0(仮想マシンのクリックインターフェイス)は次のようにレンダリングされます。br0インターフェイス:ブリッジポートが表示されないため、パケットは次から来ています。br0そしてこれからbr0

    順序が重要です。挿入インデックスを宣言すると、以下のルールが追加されたように(しかしDockerが最後のルールを追加するため)、-A挿入する必要があるルールの自然な順序が維持されます。-j RETURN

    iptables -N DOCKER-USER || true
    iptables -I DOCKER-USER 1 -i docker0 -o docker0 -j RETURN
    iptables -I DOCKER-USER 2 -i br-+ -o br-+ -j RETURN
    

    許可br0br1:

    iptables -I DOCKER-USER 3 -i br0 -o br0 -j ACCEPT
    iptables -I DOCKER-USER 4 -i br1 -o br1 -j ACCEPT
    

    libvirtとLXC(また、一般的な被害者)の他の一般的な名前に進みます。

    iptables -I DOCKER-USER 5 -i virbr0 -o virbr0 -j ACCEPT
    iptables -I DOCKER-USER 6 -i lxcbr0 -o lxcbr0 -j ACCEPT
    
  3. または、次に変更してください。iptables決定を下すために橋の情報を入手してください

    もっと一般的なように見えても、使用を避けるべきです。physdevマッチングモジュールはbr_netfilterカーネルモジュールがまだロードされていない場合に動作するようにロードするため、Dockerを使用していなくてもこの情報を得ることができ、目標はDockerのロードから自分自身を保護することですbr_netfilter。ブリッジされたフレームとルーティングされたパケット(ブリッジをルーティングインターフェイスとして使用する単一のルーティングを使用)を区別できるため、より強力です。

    Dockerは独自のチェーンで独自のLANフィルタリングを実行するため、Dockerにはまだ例外が必要です。 Docker以外のすべてとブリッジング(ルーティングではありません)が許可されます。

    iptables -N DOCKER-USER || true
    iptables -I DOCKER-USER 1 -i docker0 -o docker0 -j RETURN
    iptables -I DOCKER-USER 2 -i br-+ -o br-+ -j RETURN
    iptables -I DOCKER-USER 3 -m physdev --physdev-is-bridged -j ACCEPT
    

以前のオプションがすべての可能な状況に適していない可能性があることを検討してください。ライブラリ仮想マシンFORWARDチェーン内のルールは正しく機能しないか、Dockerルールによって短絡される可能性があります。しかし、ナットこの場合、影響を受けるルールは通常完全に正しく処理される可能性があります。ライブラリ仮想マシン(およびLXC)。

  1. 仮想マシンのDocker

    Dockerを他のネットワーキングツールと混在させないでください。ブリッジがある場合、Dockerの動作がめちゃくちゃになります。一方、適切に分離されたVMでDocker自体を実行すると、ホストやホストの他のVMやコンテナ(LXCなど)には影響しません。その後、現在のホストの設定がすでに許可されているように、このVM自体がプライマリネットワークにブリッジされている場合、コンテナに到達する外部設定は大幅に変更されません。 Dockerは、物理LANではなく物理LAN上に独自の別々のIPアドレスを持ちます。所有者の。

  2. 他の可能性(カーネル> = 5.3が必要)

    br_netfilter以下を確実にするために事前にロードしてください。システム制御設定が利用可能で、システム全体の設定は無効になります。iptablesそして:

    modprobe br_netfilter
    sysctl -w net.bridge.bridge-nf-call-iptables=0
    

    選択したDockerブリッジでそれを再度有効にします(Dockerコマンドを実行して名前を取得するスクリプトを使用することもできます)。

    ip link set dev docker0 type bridge nf_call_iptables 1
    ip link set dev br-5039242381f0 type bridge nf_call_iptables 1
    

    これは、新しく作成された各ブリッジに対して実行する必要があります。

    別の方法はドッカー内のドッカーグローバル設定のみが無効になっているコンテナで独自に実行されます(この設定は、新しいネットワークネームスペースではまだデフォルトで有効になっています...)。仮想マシンでDockerを実行するのに比べて追加の管理負担が必要なため、これはますます困難に見えます。

私は4を選択します。 (仮想マシン:可能なすべてのDocker干渉防止)または2。(簡単ですが十分です)

iptables注:上記の項目(含まれている)を置き換えると、ip6tablesすべてがIPv6で機能しますsysctl。 ~のためnftablesこの統合を見てくださいnftables具体的な回答代わりに。

おすすめ記事