まず、私の質問は次のとおりです。Virt-Manager(KVM)を使用して仮想マシンとホストとブリッジされたネットワークを設定するには?しかし、表示された答えは私にはうまくいかず、質問が解決済みとしてマークされているので、新しい質問を投稿するのが最善だと思いました。
設定を簡素化しようとしています。
- 私は(Debian + KDEを実行)
host
を持っています。eno1
eno1
すべてのインターフェイスを削除しました- ブリッジインターフェイスを作成し、スレーブインターフェイスとして
br0
追加しました。eno1
- virt-managerをインストールしました
host
今:
host
に接続しbr0
てするIPを取得- virt-managerは
VM
使用するように設定されていbr0
ますが、しないでくださいIPを取得
どんなに努力してもVM
IPを取得できません。この問題をどのように解決できますか?
以下はいくつかのスクリーンショットです。 br1は私がプレイ/テスト中なので無視してください。
接続するbr0
...
...イーサネットスレーブ付き...
...次に接続eno1
。
VM
ブリッジデバイスとして構成br0
答え1
ドッカーを使うiptablesこれを管理するコンテナライブラリ仮想マシンそれも使用してください。しかし、通常、Dockerは、次の2つの理由で同じシステム上で実行されている他のネットワーク関連ツールとはうまく機能しません。
ドッカーペイロードこれ
br_netfilter
カーネルモジュールこれは作るブリッジフレーム巡回iptables(ただebtables)。Dockerも設定します。iptables'デフォルトフィルタ/FORWARDポリシーはDROPです。
Dockerはまた、チェーンのポリシー
FORWARD
をDROP
。Dockerホストがルーターとしても機能している場合、ルーターはトラフィックを転送しなくなります。システムが引き続きルーターとして機能するようにするには、ACCEPT
チェーンに明示的なルールを追加してDOCKER-USER
それを許可できます。
これらの組み合わせと事実br_netfilter
これをデフォルトの動作に設定、Dockerに関係なく、システムに存在するすべてのブリッジはデフォルトのDROP転送ポリシーを継承します。iptables、除外ebtables存在する場合でもこれを行うことができます。渡されたフレームはすべて削除されます。
だから、すべての足は次のように作られています。ライブラリ仮想マシン影響を受ける:Dockerを実行すると、仮想マシンが隔離されます。上記のように、Dockerによって生成された接続ルールに例外を追加できます(ただし、実際には追加するのではなく挿入する必要があります)DOCKER-USER
(必要に応じて管理者が最初に生成できます)。 Dockerは常にルールを最初に挿入するため、チェーンにルールを追加するだけでFORWARD
は不十分ですDOCKER-USER
。
Docker以外のブリッジがフィルタリングされないようにするiptables、次のいずれかのオプションを使用できます。
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
またはDocker以外のインターフェースを介して一致
docker0
Dockerインターフェイスは、常に名前が付けられているか、命名をカスタマイズしない限り指定されます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
許可
br0
とbr1
: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
または、次に変更してください。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)。
仮想マシンのDocker
Dockerを他のネットワーキングツールと混在させないでください。ブリッジがある場合、Dockerの動作がめちゃくちゃになります。一方、適切に分離されたVMでDocker自体を実行すると、ホストやホストの他のVMやコンテナ(LXCなど)には影響しません。その後、現在のホストの設定がすでに許可されているように、このVM自体がプライマリネットワークにブリッジされている場合、コンテナに到達する外部設定は大幅に変更されません。 Dockerは、物理LANではなく物理LAN上に独自の別々のIPアドレスを持ちます。所有者の。
他の可能性(カーネル> = 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具体的な回答代わりに。