UbuntuでKVM仮想化しています。ゲストOSとホストOSのネットワーク設定で試行錯誤していましたが、それらしいドキュメントをとうとう見つけたので試してみます。
ゲストOSとホストOSの通信
MacVTap
普通に仮想マシンを作ると、ホストOSからゲストOSへ接続できませんし、逆もいけません。そのあたりが謎だったのですが、MacVTapのドライバー仕様のようです。

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


ブリッジの考察
英語のドキュメントですが、
・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.
とありました。「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と思います。

GUIを見ていると、基本的にはインストールされるとBridgeモードのMacVTapを使うことになっていると思います。
isolatedネットワーク
ここで、RedHatのドキュメントに載っていた、isolatedのネットワークを作成し、追加してみました。

<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を投げると、
- プライベートネットワーク
- 192.168.68.1(ルーター)
- 契約サービス
- プライベートネットワーク→VPN
- 192.168.68.1(ルーター):+25ms
- 契約サービス
- テザリング
- 192.168.67.169(スマホ)
- スマホ回線
- テザリング→VPN
- 192.168.68.1(ルーター):ただし+50~150ms
- 契約サービス
- プライベートネットワーク→テザリング
- 192.168.67.169(スマホ)
- 192.168.68.1(ルーター):ただし+10ms
- 契約サービス
- プライベートネットワーク→テザリング→VPN
- 192.168.68.1(ルーター):ただし+35ms
- 契約サービス
で期待通りの動きになっています。そもそも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″に自動設定
コメント