Azure VM 内に Hyper-V で作成した VM へ RDP で接続 （Hyper-V 仮想ネットワーク (Inetrnal NAT) の備忘）

# 実施内容
以下図のような、Azure VM 上に Hyper-V VM を作成して検証などを行う際、他の Azure VM または Azure外から直接 Hyper-V VM に対してRDPで接続できるようにします。
Azure VM 上で 仮想スイッチの作成とInetrnal NATを行い、Hyper-V上に作成した VM へ 外部から RDP で接続できるように構成していきます。

●作成するHyper-V仮想ネットワークのイメージ
<img width="400" alt="ネットワーク構成.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/57aae6eb-eb58-fb64-b9a7-958e9fa18af7.png>


●NATのイメージ
<img width="520" alt="ネットワーク構成2.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/642332da-5b5b-0985-b97f-11f9782ef24d.png>



Hyper-V(Nested) on Azure な環境を構成する方法自体は、以前記載しています。
その際には Skip した、Hyper-V仮想ネットワークの構成を今回行います。
https://qiita.com/ueda_it/items/70412a9392a57b738150

# 参考ドキュメント
参考ドキュメントは以下です。
Hyper-V 上に構成した VM が外部と疎通ができるように、NATを構成してあげます。
https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/setup-nat-network

具体的には以下で紹介されている手順に沿って進めていきます。
https://techcommunity.microsoft.com/t5/itops-talk-blog/how-to-setup-nested-virtualization-for-azure-vm-vhd/ba-p/1115338

# 仮想スイッチの作成
Azure VM 上で、PowerShell で以下を実行します。
```powershell
$switchName = "InternalNAT"
New-VMSwitch -Name $switchName -SwitchType Internal
```

または、GUIで作成する場合は以下です。
- 仮想スイッチの作成
    - [ Hyper-V マネージャー] を開き、サーバを右クリックして、 [ 仮想スイッチ マネージャー ] を選択する。
    - [ 内部 ] を選択して [ 仮想スイッチの作成 ] を行います。
    - 作成された仮想スイッチに名前やメモを設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/c4b88595-9bfd-b1d0-2762-6276698de37f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/790d1db0-12f8-d0ed-01d9-d8f481e6eb35.png)

# 仮想NICの設定
- 1.ホスト(Azure VM)側仮想NICの設定
New-NetNat を使用し、NAT ネットワークを構成します。
また、ホスト側仮想NIC(NAT ゲートウェイとなります）の設定を行います。


```powershell
New-NetNat -Name $switchName -InternalIPInterfaceAddressPrefix 192.168.0.0/24

$ifIndex = (Get-NetAdapter | ? {$_.name -like "*$switchName)"}).ifIndex
New-NetIPAddress -IPAddress 192.168.0.1 -InterfaceIndex $ifIndex -PrefixLength 24
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/b656d8fb-bba9-ba46-02ec-27c8e8ce7761.png)

- 2.ゲスト(Hyper-V VM)側仮想NICの設定のためのDHCPの構成
個別にゲストVMのNICにIPを割り当てることも可能ですが、今回はホスト(Azure VM)側で DHCP を構成し、ゲスト(Hyper-V VM)側へのIPを自動割り当てするようにしておきます。
この手順は前提として、DHCPの役割を追加する必要がありますので、追加されていない場合には追加します。

```powershell
Install-WindowsFeature -Name DHCP -IncludeManagementTools
```

DHCPの設定
```powershell
Add-DhcpServerV4Scope -Name "DHCP-$switchName" -StartRange 192.168.0.50 -EndRange 192.168.0.100 -SubnetMask 255.255.255.0
Set-DhcpServerV4OptionValue -Router 192.168.0.1 -DnsServer 168.63.129.16
Restart-service dhcpserver
```

GUIでも、DHCPの設定が追加されていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/6875fb03-7264-31ce-84b3-36c13710d335.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/839dfb0c-7448-0aeb-6b57-0f9c5aea9645.png)

Hyper-V VMを作成し、DHCPで構成すると、以下の通りDHCPで払い出されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/ad5b58d1-7657-5631-a82a-18648ed9886a.png)


これで仮想スイッチの作成と、各VMのNICの構成が完了したので、仮想マシンを作成していけます。
Hyper-V上での仮想マシンの作成については省略します。
ここまでで以下の構成が完成しています。

<img width="400" alt="ネットワーク構成.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/57aae6eb-eb58-fb64-b9a7-958e9fa18af7.png>

なお、ホスト(Azure VM)のNICを確認してみると、Azure側と接続しているNIC(Ethernet 10) と vSwitch側と接続しているNIC(vEthernet(InternalNAT))が確認できます。


<img width="400" alt="image.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/454c6867-c52c-bbc0-d7b3-058d88fe3694.png>


# NAT を構成する
外部⇒内部VMへRDPさせるため、NATを構成します。
RDPの既定のポート番号は3389です。
ホストのAzure側IPアドレスにポート番号3389で接続した場合はホスト自身へのRDPとなります。
別途、ポート番号60001と60002番を使って、
 ホストのAzure側IPアドレスにポート番号60001で接続をした場合　→　RDP②：192.168.0.50　ポート番号3389 へNAT
 ホストのAzure側IPアドレスにポート番号60002で接続をした場合　→　RDP③：192.168.0.51　ポート番号3389 へNAT
するように構成します。

<img width="520" alt="ネットワーク構成2.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/642332da-5b5b-0985-b97f-11f9782ef24d.png>

```powershell
Add-NetNatStaticMapping -NatName "InternalNAT" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 192.168.0.50 -InternalPort 3389 -ExternalPort 60001
Add-NetNatStaticMapping -NatName "InternalNAT" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 192.168.0.51 -InternalPort 3389 -ExternalPort 60002
```

これでNATが構成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/455f6558-4e47-1aea-067f-5ae240bb0fd5.png)


# RDP の確認
Azure VM へ、ポート番号 60001, 60002 で RDP して動作を確認します。
なお、パブリックIPアドレスが付与されているのであれば、パブリックIPアドレス宛にRDPすることも可能です。

パブリックIPアドレス宛に、ポート番号60001を指定してRDPを試します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/00b2e62d-0d1c-7449-3dac-9fe3e331a82a.png)

接続できました。
DHCPで構成され、IPアドレス 192.168.0.50 を持つ Hyper-V VM へ接続できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/f6db1ab6-ec4e-2135-9a9f-7657a58505a9.png)



なお、繋がらない場合は、以下のようなうっかりがないか確認します。
●Azure VM への通信をNSGで制御している場合には、受信ポートの許可規則を忘れず追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/abfffd80-552e-39a5-573f-11081355fe31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/c66a8dfa-5115-0271-5dc8-45a07789ddb7.png)

●また、Hyper-V VM側での RDP の許可も忘れずに行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461633/b8e59df3-f19a-6bd7-91bb-ba80e1fe5f47.png)




# PowerShell サンプル

```Powershell
# 
# Hyper-V と DHCP 役割追加
#
Install-WindowsFeature -Name DHCP,Hyper-V -IncludeManagementTools

# 
# 一度再起動
# 
Shutdown -R

# 
# 仮想スイッチの作成
#
$switchName = "InternalNAT"
New-VMSwitch -Name $switchName -SwitchType Internal
New-NetNat -Name $switchName -InternalIPInterfaceAddressPrefix 192.168.0.0/24
$ifIndex = (Get-NetAdapter | ? {$_.name -like "*$switchName)"}).ifIndex
New-NetIPAddress -IPAddress 192.168.0.1 -InterfaceIndex $ifIndex -PrefixLength 24

# 
# DHCPの有効化
# 
Add-DhcpServerV4Scope -Name "DHCP-$switchName" -StartRange 192.168.0.50 -EndRange 192.168.0.100 -SubnetMask 255.255.255.0
Set-DhcpServerV4OptionValue -Router 192.168.0.1 -DnsServer 168.63.129.16
Restart-service dhcpserver

# 
# NAT設定の追加
# 
Add-NetNatStaticMapping -NatName "InternalNat" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 192.168.0.50 -InternalPort 3389 -ExternalPort 60001

```


# 参考リンク

https://techcommunity.microsoft.com/t5/itops-talk-blog/how-to-setup-nested-virtualization-for-azure-vm-vhd/ba-p/1115338


http://www.vwnet.jp/Windows/WS12R2/Hyper-V/Hyper-V_Network.htm