KVMのネットワークMacVTap

サーバー

UbuntuでKVM仮想化しています。ゲストOSとホストOSのネットワーク設定で試行錯誤していましたが、それらしいドキュメントをとうとう見つけたので試してみます。

ゲストOSとホストOSの通信

MacVTap

普通に仮想マシンを作ると、ホストOSからゲストOSへ接続できませんし、逆もいけません。そのあたりが謎だったのですが、MacVTapのドライバー仕様のようです。

B.9. ゲストは外部ネットワークにアクセスできるが、macvtap 使用時にはホストにアクセスできない Red Hat Enterprise Linux 6 | Red Hat Customer Portal
The Red Hat Customer Portal delivers the knowledge, expertise, and guidance available through your Red Hat subscription.

それを何とかしようと、ブリッジの設定をいじったりするのですが、ちょっとした何かで、接続ができなくなったりよくわかりません。

ネットワーク設定「netplan」で仮想マシン用ブリッジ作成【Ubuntu 20.04】
Linuxはネットワークの設定が結構面倒です。KVMを使用するとなおさら・・・。ネット上にはあれこれと情報はありますが、Ubuntuは16.04以降、ネットワーク設定はnetplanで行うように変わっています。 (旧来の方法でもできる...
Ubuntu Server 20.04.03の仮想マシン用にブリッジを作成
かなり前に一度設定しているのですが、再度調べながら確認していきます。

ブリッジの考察

英語のドキュメントですが、

・MacVTap driver considerations
From purely a performance perspective, based on the workloads tested and the Linux and KVM levels measured, the MacVTap driver consistently demonstrated higher throughputs and better CPU efficiency.
・Open vSwitch considerations
Based on the measurement data collected in the scope of this paper, Open vSwitch is a good choice when the restrictions of MacVTap are undesirable.
・Linux bridge
Within the context of the workload analysis and measurement results obtained, the standard software bridge included in Linux can also be a reasonable choice for KVM guest connectivity.

IBM Docs
IBM Documentation.

とありました。「From purely a performance perspective, based on the workloads tested and the Linux and KVM levels measured, the MacVTap driver consistently demonstrated higher throughputs and better CPU efficiency.」ということで、MacVTapを使うのがスループット、CPU使用率的に最も良い選択肢ということでした。以前設定したブリッジ機能を使うものも良いんじゃないかということですが、KVMの機能を使ったほうが先がある気がします。

MacVTapのモード

MacVTapでは、接続モードをいろいろ選ぶ形になります。

Bridge、VEPA、Private、Passthroughから選びますが、何となく通常っぽいのはBridgeと思います。

IBM Docs
IBM Documentation.
17.12. 仮想 NIC の物理インターフェースへの直接接続 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
The Red Hat Customer Portal delivers the knowledge, expertise, and guidance available through your Red Hat subscription.

GUIを見ていると、基本的にはインストールされるとBridgeモードのMacVTapを使うことになっていると思います。

isolatedネットワーク

ここで、RedHatのドキュメントに載っていた、isolatedのネットワークを作成し、追加してみました。

B.9. ゲストは外部ネットワークにアクセスできるが、macvtap 使用時にはホストにアクセスできない Red Hat Enterprise Linux 6 | Red Hat Customer Portal
The Red Hat Customer Portal delivers the knowledge, expertise, and guidance available through your Red Hat subscription.
<network>
  <name>isolated</name>
  <ip address='192.168.254.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.254.2' end='192.168.254.254' />
    </dhcp>
  </ip>
</network>

こちらを、KVMのホストサービスの設定に書き込み(GUIからXMLの追加も可能)、

<interface type='network'>
  <source network='isolated'/>
  <model type='virtio'/>
</interface>

接続する仮想マシンのネットワーク設定に追加します。GUIで行う際には、既存のNICのXMLに追記するのではなく、新しいデバイスを設定する画面から設定します。

接続はできたけれど・・・

設定してみたところ、通常状態では問題なく動作しましたが、外部からVPN接続するとVPNクライアントからVPNサーバー側のネットワークを利用できなくなってしまいました。

仕様をよく理解できていれば対処法もわかるかもしれませんが、あきらめて以前行っていた設定である、Linux側機能のブリッジを作成して利用する方法で使うことにしました。

使用設定

下記の設定で、プライベートネットワーク上のWindowsマシンからSSHログインでき、ホストとゲスト相互、ゲスト同士でpingが通り、ホストのNICを通じて外部への接続もできました。

スマートフォンのテザリングを利用したWindowsマシンからは、SoftEtherクライアントでVPN接続すると、

不明なアダプター VPN - VPN Client:

   接続固有の DNS サフィックス . . . . .:
   IPv4 アドレス . . . . . . . . . . . .: 192.168.68.59
   サブネット マスク . . . . . . . . . .: 255.255.252.0
   デフォルト ゲートウェイ . . . . . . .: 192.168.68.1

ipconfigでVPN接続先のプライベートアドレスを割り当てられ(表示を一部省略)、SoftEtherVPNサーバー以外のプライベートアドレスへはpingが通りSSH接続も可能になりました。Windowsのシェルからpingを投げると、

  1. プライベートネットワーク
    1. 192.168.68.1(ルーター)
    2. 契約サービス
  2. プライベートネットワーク→VPN
    1. 192.168.68.1(ルーター):+25ms
    2. 契約サービス
  3. テザリング
    1. 192.168.67.169(スマホ)
    2. スマホ回線
  4. テザリング→VPN
    1. 192.168.68.1(ルーター):ただし+50~150ms
    2. 契約サービス
  5. プライベートネットワーク→テザリング
    1. 192.168.67.169(スマホ)
    2. 192.168.68.1(ルーター):ただし+10ms
    3. 契約サービス
  6. プライベートネットワーク→テザリング→VPN
    1. 192.168.68.1(ルーター):ただし+35ms
    2. 契約サービス

で期待通りの動きになっています。そもそもVPN接続しなくても通過可能な場合には(意味はないですが)VPN接続を介してもSoftEtherVPNマシンへの接続は可能ですが、SoftEtherVPNサーバーをリモートで触りたい場合、遠回りですがVPN接続後にSSHでホストマシンへ接続してvirt-managerのGUIかホストマシンからSoftEtherVPNマシンへSSHでやる他なさそうです。

ホストマシンnetplan
network:
  ethernets:
    eno1:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.68.52/22]
      gateway4: 192.168.68.1
      nameservers:
        addresses: [1.1.1.1, 8.8.8.8]
      optional: true
  bridges:
    br0:
      interfaces: [ eno1 ]
      addresses: [192.168.68.100/22]
      gateway4: 192.168.68.1
      dhcp4: no
      nameservers:
        addresses: [1.1.1.1, 8.8.8.8]
  version: 2
ホストマシン QEMU/KVM Connection Details → Virtual Networks
<network connections="1">
  <name>host-bridge</name>
  <uuid>自動で決まった値</uuid>
  <forward mode="bridge"/>
  <bridge name="br0"/>
</network>
ゲストマシン NIC
<interface type="bridge">
  <mac address="自動で決まった値"/>
  <source network="host-bridge" portid="自動で決まった値" bridge="br0"/>
  <target dev="vnet0"/>
  <model type="virtio"/>
  <alias name="net0"/>
  <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>

2つ目のゲストマシンは”vnet0″ではなく”vnet1″に自動設定

 

 

 

コメント

タイトルとURLをコピーしました