メモの日々


2024年04月02日(火) [長年日記]

[windows][net][howto] Hyper-V上のVMを内部仮想スイッチ経由で繋ぎポートフォワードで外部からアクセス可能にする

Hyper-V上のVMに外部からアクセスできるようにしたいが、ホストの物理ネットワークに直接接続する(「外部仮想スイッチ」経由で繋ぐ)のではなく、仮想ネットワークに接続して必要なサービスだけをポートフォワードにより外部からアクセスできるようにしたい。

そのためには「内部仮想スイッチ」と「NATネットワーク」を作成して両者を関連付け、VMを内部仮想スイッチに接続してIPアドレスを設定し、更にポートマッピングの設定をすればいいようだ。

内部仮想スイッチの作成

Hyper-Vにはデフォルトの仮想スイッチとして「Default Switch」が用意されているが、このスイッチはホストの再起動でIPアドレスが変わりポートフォワードの設定がうまくできないようだった。なので、それとは別の仮想スイッチを作成する。

仮想スイッチはGUIのHyper-Vマネージャから次のようにして作成できる。

  1. 対象の仮想化サーバーに接続する。
  2. 仮想化サーバーに対するメニューから[操作]→[仮想スイッチマネージャー]を選び仮想スイッチマネージャーの画面を開く。
  3. 左ペインの「新しい仮想ネットワークスイッチ」を選択し、右ペインで「内部」を選択して「仮想スイッチの作成」ボタンをクリックする。
  4. 新しい仮想スイッチが追加されるので、名前を付けて「OK」ボタンをクリックする。

なお、GUIを使わずNew-VMSwitchコマンドを使うことでも作れそう。

次に仮想スイッチへIPアドレスを設定する。New-NetIPAddressコマンドで設定できる。

New-NetIPAddress -InterfaceIndex 「仮想スイッチインデックス」 `
    -IPAddress 「IPアドレス」 -PrefixLength 「プレフィックス長」

ここで、「仮想スイッチインデックス」はGet-NetAdapterコマンドGet-NetIPAddressコマンドにより取得できる。

NATネットワークの作成

NATネットワークはNew-NetNatコマンドにより作成できる。

New-NetNat -Name 「NATネットワーク名」 -InternalIPInterfaceAddressPrefix 「IPアドレス/プレフィックス長」

ここで、「IPアドレス/プレフィックス長」には仮想スイッチへ付与したIPアドレスが属するネットワークを指定する。

VMがNATを使えるようにする

仮想化サーバー上にVMを作成し、Hyper-Vマネージャから次を行う。

  1. 仮想マシンに対するメニューから[操作]→[設定]を選び仮想マシンの設定画面を開く。
  2. 左ペインの「ネットワークアダプター」を選択し、右ペインで「仮想スイッチ」を上で作成した内部仮想スイッチに変更して「OK」ボタンをクリックする。

これにより、NATを使ってVMからインターネットなどホスト側のネットワークへ接続できるようになる。

はじめ、既存のネットワークアダプタの設定はそのまま(Default Switchを使用)にしてネットワークアダプターを新規追加してそちらに新しい内部仮想スイッチを設定するようにしていたのだけれど、そうするとポートフォワードが機能せず時間を無駄にした。Default SwitchもNATを使っており、NATを使うネットワークアダプタが複数あると機能しないのだと思う。

ポートマッピングを設定する

まず、VMの当該ネットワークアダプターに固定のIPアドレスを付与する。これはVM上で動くOSの機能を使って行う。

その上で、Add-NetNatStaticMappingコマンドによりポートマッピングを設定する。

Add-NetNatStaticMapping 「NATネットワーク名」  -Protocol TCP `
    -ExternalIPAddress 「VMのホストのIPアドレス」 -ExternalPort 「VMのホストが公開するポート」 `
    -InternalIPAddress 「VMのIPアドレス」 -InternalPort 「VM上のサービスのポート」

これにより、ホスト側のネットワークからVM上の当該サービスへアクセスできるようになる。

参考