web-dev-qa-db-ja.com

KVM仮想マシン上のワイヤレスブリッジ

無線ルーターに接続されているVMホスト(KVM)があります。仮想ゲストをホストと同じブロードキャストドメインに入れたい、つまりルーターのIPからIPを受け取りたいDHCP(=レイヤー2ブリッジ)

KVMドキュメント によると不可能です:Important Note: Unfortunately, wireless interfaces cannot be attached to a Linux Host bridge, so if your connection to the external network is via a wireless interface ("wlanX"), you will not be able to use this mode of networking for your guests.(とにかく試してみましたが、実際には機能しません:))

ルーティングされたインターフェイスを作成する方法を提案しているインターネットのリソースがいくつかあります。しかし、それはレイヤ3であり、ゲストは別のIPサブネットに存在します。

ただし、私は過去にVirtualBoxを使用しました-そしてワイヤレスブリッジが機能します

VirtualBoxについて スーパーユーザーの質問 が見つかりました。これについて説明します:Many virtual machine programs come with a special "bridge" or "filter" driver which attaches to existing network interfaces and allows the program to send and receive packets (Ethernet frames) directly

それがまさに私が望む結果です-KVMイーサネットブリッジングによる仮想化(レイヤー2)。残念ながら、libvirt/KVMにはドライバーなどが含まれていないようです。しかし、他のいくつかのUnixツールで達成されました。

7
Zvika

Zvikaとまったく同じ要件がありました。ちなみに、この件に関する彼の投稿は素晴らしいものです。私が見つけた代替案はこれです:ルーティングされたネットワークをKVM 192.168.1.160/28の範囲で構成します(したがって、dedoimedoの3番目のソリューション、「ダーティハック」)。次に、 ARPプロキシはZvikaの方法で、同じ名前のパッケージとしてUbuntu/Mintで利用できるparproutedを使用しました。parproutedでは、次のように入力するだけです。

Sudo parprouted virbr1 wlan0

ちなみに、トラフィックはゲストVMと192.168.1.0/24ネットワーク内の他のデバイス、および外部システム(インターネットサイトなど)との間の双方向の両方で機能します)ネットワークはNATの背後にあります。

とにかくこれは大変でした。私はこのテーマを何日も検索しましたが、Zvikaのブログエントリほど明確なソースはありませんでした。

3
Mauro Molinari

公式ドキュメントはあまりにも悲観的です。いつものように、賢い誰かがそれを理解しました:これを行うための(長い)指示 ここ を見つけます。私はそれを試しました、それは簡単です。

編集:

上記の記事に掲載されている最初の解決策がなぜ機能しないのかはわかりません。私には効果があり、追加情報を提供していません。それでも、プロキシーARPを使用するBohdi Zazenによって提供される代替ソリューション here を検討することをお勧めします。私はこれを試したことはありませんが(sol。n.1がうまくいったので、何がポイントだったのでしょうか)、チャンスを与えることができます。

2
MariusMatutiae

「ワイヤレスアダプタ」ではなく、ブリッジングはサポートされていません。アクセスポイントとWiFi Host-to-apプロトコルです。接続を確立すると、アダプターのMACが認証されます。プロトコルには、3つのMAC用のスペースがあります。即時認証された参加者と3番目のMAC-APの背後にあるエンドポイント用です。したがって、WiFiモバイルステーションは任意のMACにパケットを送信できますが、送信元アドレスとして自身のMACのみを使用します。認証された別の送信元MACでパケットを送信できませんでした-APはそのパケットを拒否します。

WDSと呼ばれる、真のブリッジングが可能なWiFiプロトコルもあります。これは、パケットで4つのMACアドレスを許可することで行われます。2つ-即時認証された参加者、つまりAPのブリッジングと、2つ-パケットがWiFiブリッジによって転送されているエンドポイント(ソースと宛先)。

ここを読んでください http://wiki.mikrotik.com/wiki/Manual:Wireless_Station_Modes#802.11_limitations_for_L2_bridging これについて。

WDSが十分に標準化されておらず、各ベンダーが独自にそれを比類のない方法で評価しているのは残念です。 WiFiアライアンスの方がユーザー指向の組織である場合にのみ、仕様が改善され、任意のベンダーソリューション間、および実際にゲストマシンとワイヤレスネットワーク間でWi-Fiブリッジをあちこちで行うことができます。

プロキシARPはL2ソリューションではありませんが、ルーティングソリューション、つまりL3です。それは両側をだますので、あちこちで同じサブネットを持つことができますが、それでもこれはルーティングであり、ちなみにこれはネットワークをいくらか台無しにしています。何が起こっているかを確認するには、任意のマシンのMACテーブルを参照してください。「その側」のすべてのMACは、プロキシARPルーターのMACです。

真のL2ソリューションの場合、ebtablesユーティリティで構成されたLinuxの「MAC NAT」機能を試すことができます。これが私が知っている唯一の真のL2ソリューションなので、VirtualBoxで使用されていると思う傾向があります。ただし、基本的にはproxy-arpのように見えます。これをKVMおよびlibvirtで実装できるはずです。

2

KVMのドキュメントによると、ワイヤレスNICでブリッジを使用することはできません。 VirtualBoxでゲストをブリッジするのに使用した理由がわかりません。

ゲストをホストのワイヤレスネットワークに接続する方法を見つけるために数時間を費やしましたが、TAPデバイスを使用するのが最も簡単な方法であることがわかりました。この方法の唯一の欠点は、ゲストでDHCPを使用できず、ワイヤレスネットワークサブネットからIPアドレスを手動で付与する必要があることです(これにより、多数のVMをデプロイする場合に、IPの競合や不便が生じる可能性があります)。

TAPデバイスを使用してホストのワイヤレスネットワークでゲストを接続する手順は次のとおりです。

0/LinuxカーネルのIPv4ルーティングを有効にする

Sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

1/Sudoなしでユーザーguest(ユーザー名に置き換え)からアクセスできるtap0という名前のタップデバイスを作成します。

Sudo ip tuntap add mode tap tap0 user guest
Sudo ip link set tap0 up

2/tap0デバイスにIPアドレスを割り当てます(ワイヤレスネットワークサブネットからである必要はありません)。

Sudo ip addr add 10.10.10.10/24 dev tap0

3/parprouted(インストールが必要な場合があります)を使用して、ホストのワイヤレスNICの背後にあるゲストイーサネットをブリッジできるプロキシarpブリッジを実装します。

Sudo parprouted wlan0 tap0

(wlan0をホストのワイヤレスインターフェイスに置き換えます)

4 /いくつかのルーティングテーブルエントリを追加して、パケットがタップデバイスの両端を通過できるようにします。

Sudo iptables -A INPUT -i tap0 -j ACCEPT
Sudo iptables -A FORWARD -i tap0 -j ACCEPT
Sudo iptables -A FORWARD -o tap0 -j ACCEPT

ゲストで、ホストのワイヤレスネットワークサブネットから静的IPアドレスを割り当てます。たとえば、wlan0が192.168.1.0/24にある場合、ゲストは

Sudo ip addr add 192.168.1.30/24 dev eth0

(eth0はゲストのNICです)

または永続的に/ etc/network/interfacesで:

auto eth0
iface eth0 inet static
  address 192.168.1.30
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255
  gateway 192.168.1.25

次の方法でゲストを起動します。

kvm -hda guest.img -m 512 -net nic -net tap,ifname=tap0,script=no

これで、ワイヤレスネットワークに接続されているすべてのマシンとゲストの間でpingが機能します。

0
Karim Manaouil