今更ながらにHyper-vの冗長化 (Hyper-Vレプリケーション 七転八倒編)

仮想化ホストを冗長化してみようというテスト。
まずはHyper-Vのレプリケーション機能を使って最低限の冗長性を。
最低限なのでADとか使いません。

# !!!注意!!!
**この試みは失敗に終わっています。解決編まで見てね。**
**この試みは失敗に終わっています。解決編まで見てね。**
**この試みは失敗に終わっています。解決編まで見てね。**


# テスト環境
![テスト環境](https://qiita-image-store.s3.amazonaws.com/0/199750/ccfdf9c2-3028-fcab-4837-e85da499c3d8.png)

Windows Server 2016 + Hyper-Vを導入したサーバーを2台用意。
最低限のネットワークとしてHyperVで使用するホスト用と、サーバー間データ転送に使うストレージ用の2つのネットワークを作成。

||HyperV1|HyperV2|
|:----:|:----:|:----:|
|ホスト名|castor[^1]|pollux[^1]|
|fqdn|castor.hyperv.local|pollux.hyperv.local|
|eth0|192.168.11.231|192.168.11.232|
|eth1|10.20.30.10|10.20.30.20|

fqdnで証明書を作るのでシステムのプロパティからプライマリDNSサフィックスを登録しておく。

![スクリーンショット (43).png](https://qiita-image-store.s3.amazonaws.com/0/199750/83f338c2-9a66-ad7a-1edc-c09345ceb281.png)

hostsにそれぞれfqdnで接続できるように設定

```bash:{system32}\drivers\etc\hosts
10.20.30.10	castor.hyperv.storage
10.20.30.20	pollux.hyperv.storage

192.168.11.231 castor.hyperv.local
192.168.11.232 pollux.hyperv.local
```

それぞれのネットワークで相互の導通が確認できている状態。
[^1]: カストルとポルックスは双子座のもととなったギリシャ神話の兄弟


# Hyper-Vにレプリケーションを設定

## 双方のサーバー用のオレオレ証明書[^2]を作る
[^2]: 自己署名証明書のこと
![スクリーンショット (46).png](https://qiita-image-store.s3.amazonaws.com/0/199750/c6e3b5e8-a082-c277-3059-18719dc88a14.png)

ADを使わないでレプリケーションをするためには証明書ベースで認証する必要がある。
ところが正式な証明書をきちんと手に入れるためにはADがほしいという再帰構造で非常に面倒くさいのでオレオレ証明書でやっつける。

Windows10 / Windows Server 2016 以降用。
どこの環境で作っても一緒なので適宜。以下castorで作業。

ホスト名保証用のfqdnとストレージネットワーク用のfqdnをサブジェクト代替名に併記しておく。

```powershell
PS C:\Users\Administrator> New-SelfSignedCertificate -DnsName "castor.hyperv.local","castor.hyperv.storage" –CertStoreLocation "cert:\LocalMachine\My" -TestRoot

   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint                                Subject                                                                                                                                                           
----------                                -------                                                                                                                                                           
6B8F53418C906ACDD707810073F4424C4963447A  CN=castor.hyperv.local                                                                                                                                            

PS C:\Users\Administrator> New-SelfSignedCertificate -DnsName "pollux.hyperv.local","pollux.hyperv.storage" –CertStoreLocation "cert:\LocalMachine\My" -TestRoot

   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint                                Subject                                                                                                                                                           
----------                                -------                                                                                                                                                           
97E639E2F79BCC1ED44431DC48EAE1DACD79646A  CN=pollux.hyperv.local  
```
それ以前のバージョンだと `-TestRoot`が使えないので先にルート証明書を作る必要があるみたい。

- [ポイント対サイトの証明書の作成とエクスポート: MakeCert : Azure \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-certificates-point-to-site-makecert)
- [Generate and export certificates for Point\-to\-Site: Linux: CLI: Azure \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-certificates-point-to-site-linux)

## 出来た証明書の確認とエクスポート
コンピュータの証明書スナップイン[^3]を開いて確認してみる。
[^3]: ファイル名を開いて実行から`certlm.msc`

### サーバー証明書
![スクリーンショット (48).png](https://qiita-image-store.s3.amazonaws.com/0/199750/d7290238-8008-47aa-11b7-313297a59deb.png)
証明書作成時に ` –CertStoreLocation "cert:\LocalMachine\My"`と指定しているのでローカルコンピューター/個人/証明書に証明書ができているのでこれをそれぞれエクスポートする。

#### ウィザードの流れ
![スクリーンショット (50).png](https://qiita-image-store.s3.amazonaws.com/0/199750/2a1ca6c6-9041-155f-8539-aae02c273483.png)
ここから
![スクリーンショット (51).png](https://qiita-image-store.s3.amazonaws.com/0/199750/6488b23c-df34-a121-1a3e-05b30a25d080.png)
こう
![スクリーンショット (52).png](https://qiita-image-store.s3.amazonaws.com/0/199750/4b24b511-5d92-2df9-750e-02f228ae215b.png)
こう
![スクリーンショット (53).png](https://qiita-image-store.s3.amazonaws.com/0/199750/23d0f0da-a63d-b955-0747-497140b3664e.png)
こう
![スクリーンショット (54).png](https://qiita-image-store.s3.amazonaws.com/0/199750/52ba3ee1-e7ce-e443-c775-92764077fbee.png)
こうして
![スクリーンショット (55).png](https://qiita-image-store.s3.amazonaws.com/0/199750/c2c3abd4-6311-d7b0-ebc8-65ff89bc24a0.png)
こうじゃ


###ルート証明書
あとルート証明書が`-TestRoot`によって
![スクリーンショット (47).png](https://qiita-image-store.s3.amazonaws.com/0/199750/ebd187b8-f14c-fa69-4483-da77c85213ae.png)
中間証明機関/証明書にできているのでこれもエクスポート。

####ウィザードの流れ
![スクリーンショット (56).png](https://qiita-image-store.s3.amazonaws.com/0/199750/1cf752b9-ec3c-50e3-1d49-bc5082df65ce.png)
こう
![スクリーンショット (57).png](https://qiita-image-store.s3.amazonaws.com/0/199750/3aceeeb6-b3c9-6ba1-aa2f-39b58022760b.png)
こう
![スクリーンショット (58).png](https://qiita-image-store.s3.amazonaws.com/0/199750/511f4664-2c2f-db15-d1a3-7b378059c203.png)
こう
![スクリーンショット (59).png](https://qiita-image-store.s3.amazonaws.com/0/199750/e3cf9522-9fdf-c8cf-f08d-30562bf717bc.png)
はい。

## 証明書を双方のサーバー[^4]にインストールする。
[^4]: 双方にインポートしておかないと双方向レプリケーションが使えないの。

![スクリーンショット (60).png](https://qiita-image-store.s3.amazonaws.com/0/199750/1dac2a2e-2528-2c12-c598-39c63deb7f54.png)
ここまででこのファイルが出来ているので、これをそれぞれのサーバーにコピーする。

(今回は証明書をcastorで作ったので証明書の登録はpolluxでやる。)

### ルート証明書のインストール
![スクリーンショット (65).png](https://qiita-image-store.s3.amazonaws.com/0/199750/be85352f-6eeb-1b97-bb84-8de95d0db36f.png)
こうやって
![スクリーンショット (62).png](https://qiita-image-store.s3.amazonaws.com/0/199750/b6f08f0e-4030-24b4-7bee-17a7591fb4d0.png)
こう
![スクリーンショット (63).png](https://qiita-image-store.s3.amazonaws.com/0/199750/2b0f9fc3-7a0d-4340-5f27-a2f214adb668.png)
こう
![スクリーンショット (64).png](https://qiita-image-store.s3.amazonaws.com/0/199750/b74511bf-64ac-2619-9639-0de8f997ed61.png)

### サーバー証明書のインストール
![スクリーンショット (66).png](https://qiita-image-store.s3.amazonaws.com/0/199750/dde45db7-7404-8b9f-d26e-3f9d00de99d3.png)
こうやって
![スクリーンショット (67).png](https://qiita-image-store.s3.amazonaws.com/0/199750/64728b35-454f-a624-0b03-d0c9214dc1bc.png)
こう
![スクリーンショット (68).png](https://qiita-image-store.s3.amazonaws.com/0/199750/6cf52350-eee2-f043-094e-c7d5ff0e3038.png)
こう
![スクリーンショット (69).png](https://qiita-image-store.s3.amazonaws.com/0/199750/356849bb-d2a0-4cbf-3aad-6ce53935a520.png)
こう
![スクリーンショット (70).png](https://qiita-image-store.s3.amazonaws.com/0/199750/259f4b0b-47d1-f6b9-4b9c-a2bcaaa7c2d5.png)
こう
![スクリーンショット (71).png](https://qiita-image-store.s3.amazonaws.com/0/199750/b4e365db-e3d0-ce65-8de0-a8083ef60e48.png)
はい。

**これを2サーバー分繰り返す**
**これを2サーバー分繰り返す**
**これを2サーバー分繰り返す**

大事なことなので3回(ry

## HyperVサーバー上で証明書を作っていたらルート証明書を信頼できるとこに置く
ほかのPCで証明書作った場合は関係ないです。

![スクリーンショット (72).png](https://qiita-image-store.s3.amazonaws.com/0/199750/f7ba06a2-cc00-870c-7478-b727005c1e13.png)

`信頼されたルート証明機関/証明書`にドラッグ&ドロップでポイっとする。

# Hyper-Vにレプリケーションの設定をする

![スクリーンショット (73).png](https://qiita-image-store.s3.amazonaws.com/0/199750/25881c76-0e99-54df-5f66-4e39f9ca5383.png)
ここまでで**両方のサーバーで双方の証明書が登録されてる**はずなのでここからHyperVに設定していく。

## 念の為オレオレ証明書の失効チェックを外しておく

ここまでの流れで作った証明書は1年で失効するので念の為。
｢このテスト環境なんてすぐ捨てるから関係ねーよ｣って人は無視してOK

```powershell
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Replication" /v DisableCertRevocationCheck /d 1 /t REG_DWORD /f
```

## レプリケーションの設定

レプリケーションには方向があってVMが動作する方のサーバーを**プライマリ**、プライマリの情報を逐次同期して備えておくほうのサーバーを**レプリカ**と呼ぶ。

まずはcastorをプライマリ、polluxをレプリカとして設定してみる。
![Untitled (1).png](https://qiita-image-store.s3.amazonaws.com/0/199750/7e6f5031-db71-8dbb-5ba8-43bb3de3c18c.png)

### レプリカサーバー(pollux)で受け入れ準備

![スクリーンショット (75).png](https://qiita-image-store.s3.amazonaws.com/0/199750/7f6cea3b-b184-c730-da22-4a9b187b9a3d.png)

`レプリケーションの構成`からチェックボックス2個チェックして証明書を選択。でOK。
ここでエラーが出たら証明書のインストールが終わってないかルート証明書が信頼できないか、そのあたり。

![スクリーンショット (76).png](https://qiita-image-store.s3.amazonaws.com/0/199750/1a0a77c7-ec4d-e0a8-708c-41b1bf1d411d.png)
VMのレプリケーションにはSSL(443)を使用するのでファイアーウォールに穴をあける。

![スクリーンショット (77).png](https://qiita-image-store.s3.amazonaws.com/0/199750/ddb75a86-5669-a612-657e-ae2f48b6f190.png)

これでOK。

## プライマリサーバー(castor)のVMにレプリケーションの設定

プライマリで稼働しているVMにレプリケーションの設定をする。
![スクリーンショット (78).png](https://qiita-image-store.s3.amazonaws.com/0/199750/e8e0ff7e-eec8-b355-da19-fd4a7f9699d2.png)
VMからウィザード開いて
![スクリーンショット (79).png](https://qiita-image-store.s3.amazonaws.com/0/199750/c516d277-5d34-f2d6-33bd-4ac21e6ef4ee.png)
こうして
![スクリーンショット (80).png](https://qiita-image-store.s3.amazonaws.com/0/199750/2873df66-59fa-4fb7-d2e0-852f5fd4d5f0.png)
こう
![スクリーンショット (81).png](https://qiita-image-store.s3.amazonaws.com/0/199750/21ed2bac-1c3a-df36-7a5f-e3ac13f42409.png)
こうなって
![スクリーンショット (82).png](https://qiita-image-store.s3.amazonaws.com/0/199750/2c3069a9-c8e9-ccce-4896-ec31b9514b3f.png)
こう
![スクリーンショット (88).png](https://qiita-image-store.s3.amazonaws.com/0/199750/a0228855-bd32-1499-816f-ec31f66d5876.png)
できた!

![スクリーンショット (88)1.png](https://qiita-image-store.s3.amazonaws.com/0/199750/3a49ed39-a8ca-bfe5-85a9-b99a8c4c34b8.png)

＼(^o^)／

# 七転八倒

## 試しにhyperv.localネットワークでレプリケーションしてみる
![スクリーンショット (93).png](https://qiita-image-store.s3.amazonaws.com/0/199750/c8947f58-6c0e-6266-200d-465900bba9de.png)

![スクリーンショット (94).png](https://qiita-image-store.s3.amazonaws.com/0/199750/52ed1f40-d41b-4214-66a2-67ba948a8109.png)

てめぇ!

これなんかの原因で間違ったNIC使ってるわ。

## ルーティングでNICを縛る

```powershell
C:\Users\Administrator>route print -4
===========================================================================
インターフェイス一覧
  7...00 25 90 2d 80 a9 ......Intel(R) 82576 Gigabit Dual Port Network Connection
  6...00 25 90 2d 80 a8 ......Hyper-V Virtual Ethernet Adapter
  1...........................Software Loopback Interface 1
  3...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
 11...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
 17...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0     192.168.11.1   192.168.11.231    291
       10.20.30.0    255.255.255.0            リンク上       10.20.30.10    291
      10.20.30.10  255.255.255.255            リンク上       10.20.30.10    291
     10.20.30.255  255.255.255.255            リンク上       10.20.30.10    291
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    331
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    331
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
     192.168.11.0    255.255.255.0            リンク上    192.168.11.231    291
   192.168.11.231  255.255.255.255            リンク上    192.168.11.231    291
   192.168.11.255  255.255.255.255            リンク上    192.168.11.231    291
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    331
        224.0.0.0        240.0.0.0            リンク上       10.20.30.10    291
        224.0.0.0        240.0.0.0            リンク上    192.168.11.231    291
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
  255.255.255.255  255.255.255.255            リンク上       10.20.30.10    291
  255.255.255.255  255.255.255.255            リンク上    192.168.11.231    291
===========================================================================
固定ルート:
  ネットワーク アドレス          ネットマスク  ゲートウェイ アドレス  メトリック
          0.0.0.0          0.0.0.0     192.168.11.1     既定
          0.0.0.0          0.0.0.0     192.168.11.1     既定
===========================================================================

C:\Users\Administrator>route add -p 10.20.30.0 mask 255.255.255.0 10.20.30.1 metric 1
OK!
```

```powershell
C:\Users\Administrator>route print -4
(略)
===========================================================================
固定ルート:
  ネットワーク アドレス          ネットマスク  ゲートウェイ アドレス  メトリック
          0.0.0.0          0.0.0.0     192.168.11.1     既定
          0.0.0.0          0.0.0.0     192.168.11.1     既定
       10.20.30.0    255.255.255.0       10.20.30.1       1
===========================================================================
```

で、再実行。

![スクリーンショット (95).png](https://qiita-image-store.s3.amazonaws.com/0/199750/8737e557-de3f-5ddb-9ba1-09b8237d698c.png)

なぜだ!

## 名前解決が間違えるなら名前を変えればいいじゃない

[WindowsのNICの選び方の罠 \- Qiita](https://qiita.com/qyen/items/7a501e30634d7f36ccc7)


```bash:{system32}\drivers\etc\hosts
10.20.30.10	castor-LB , castor-LB.hyperv.storage
10.20.30.20	pollux-LB , pollux-LB.hyperv.storage

192.168.11.231	castor , castor.hyperv.local
192.168.11.232	pollux , pollux.hyperv.local
```
![スクリーンショット (106).png](https://qiita-image-store.s3.amazonaws.com/0/199750/159ede85-a51e-0fa5-39f6-6238ef1fb818.png)
証明書も作り直し

![スクリーンショット (107).png](https://qiita-image-store.s3.amazonaws.com/0/199750/fd36a5b5-d218-b01a-71d5-c8ff00d3d1da.png)

あばばばばばば

## 0x00002EFE でぐぐぐぐる

[When Hyper\-V Replica fails to initialize ← MIRU\.CH](http://www.miru.ch/when-hyper-v-replica-fails-to-initialize/)
![スクリーンショット (108).png](https://qiita-image-store.s3.amazonaws.com/0/199750/d8188f5b-f3d0-9aaa-8ffd-a3d53c71af3a.png)

これ認証系のエラーだなぁ。

- [Hyper\-V Replica failing](https://www.experts-exchange.com/questions/28019613/Hyper-V-Replica-failing.html)

- [Enable replication failed: authenticate replica server using Kerberos authenticate \- Resolution with screenshots](http://www.chicagotech.net/win8&2012/replicaissue1.htm)

## もう開き直ってレプリカ側の名前を変えてやる!

![スクリーンショット (109).png](https://qiita-image-store.s3.amazonaws.com/0/199750/cc425330-febd-9c23-6ed0-e1c155778b25.png)

で、こうじゃ!
![スクリーンショット (110).png](https://qiita-image-store.s3.amazonaws.com/0/199750/bc3bfd73-6a21-2855-0b4a-e59225af3fd7.png)

あっ。

![スクリーンショット (111).png](https://qiita-image-store.s3.amazonaws.com/0/199750/15f0b450-b65d-c183-fcca-bfe4b60ab974.png)

ああっ。


[今更ながらにHyper\-vの冗長化 \(Hyper\-Vレプリケーション 解決編\) \- Qiita](https://qiita.com/qyen/items/933ec04b253fc2ee37c2)につづく

# 今日の反省会場

よくよく考えればレプリカ受付のHTTPSは名前ベースの仮想ホスト(ApacheのVirtualHost的な)なんだから、そのベース名はシステムのFQDNしかないよな。ないですよね。ちくしょう。


# 参考

+ [Windows Server 2016: Configuring Hyper\-V Replica in a workgroup environment – Part1 \| Michael Firsov](https://michaelfirsov.wordpress.com/hyper-v-replica-in-windows-server-2016-configuring-certificate-based-authentication-part1/)