Репликация Hyper-V между серверами без домена
В домене Hyper-V Replica использует Kerberos и незашифрованный канал по порту 80. Без домена Kerberos недоступен, поэтому взаимная аутентификация хостов выполняется сертификатами по HTTPS (порт 443). Статья описывает настройку такой схемы на двух автономных хостах Windows Server.
Что потребуется
- два хоста с ролью Hyper-V (пример:
HV1иHV2), не входящие в домен; - сетевая связность между ними и открытый порт 443/TCP;
- на приёмнике — свободное место не меньше, чем занимают реплицируемые ВМ;
- у реплицируемых ВМ не должно быть контрольных точек (снапшотов);
- права локального администратора на обоих хостах.
Первичная синхронизация передаёт весь объём диска ВМ. Для машин на сотни гигабайт планируйте её на нерабочее время либо используйте начальную репликацию с внешнего носителя (вариант Send initial copy using external media в мастере).
Шаг 1. Разрешение имён
Сертификаты выпускаются на полные имена хостов, поэтому имена должны одинаково разрешаться на обеих сторонах. Без DNS проще всего прописать записи в hosts.
Задаём одинаковый DNS-суффикс на обоих хостах (пример — lab.local):
# требует перезагрузки
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' `
-Name 'Domain' -Value 'lab.local'
Restart-Computer
После перезагрузки на обоих хостах добавляем записи в C:\Windows\System32\drivers\etc\hosts:
10.0.0.11 hv1.lab.local hv1
10.0.0.12 hv2.lab.local hv2
Проверяем, что имена резолвятся в обе стороны:
Resolve-DnsName hv2.lab.local
Test-NetConnection hv2.lab.local -Port 443
Шаг 2. Выпуск самоподписанных сертификатов
Нужны два сертификата — по одному на каждый хост. Требования к сертификату Hyper-V Replica:
- имя в поле Subject/DNS совпадает с полным именем хоста;
- назначения (EKU) — Проверка подлинности сервера и Проверка подлинности клиента (хост выступает и приёмником, и источником);
- закрытый ключ экспортируемый (сертификат нужно перенести на второй хост).
Выпускаем оба сертификата на одном хосте (удобнее сразу получить общий корневой):
$notAfter = (Get-Date).AddYears(3)
$eku = '2.5.29.37={text}1.3.6.1.5.5.7.3.1,1.3.6.1.5.5.7.3.2' # Server + Client Auth
New-SelfSignedCertificate -DnsName 'hv1.lab.local' -NotAfter $notAfter `
-CertStoreLocation 'Cert:\LocalMachine\My' -TextExtension $eku -TestRoot
New-SelfSignedCertificate -DnsName 'hv2.lab.local' -NotAfter $notAfter `
-CertStoreLocation 'Cert:\LocalMachine\My' -TextExtension $eku -TestRoot
Ключ -TestRoot создаёт тестовый корневой сертификат и кладёт его в промежуточные центры сертификации — оттуда его нужно перенести в доверенные корневые, иначе цепочка не проверится.
Перенос корневого сертификата в доверенные
# экспорт тестового корневого (CN начинается с "CN=" тестового root)
$root = Get-ChildItem Cert:\LocalMachine\CA |
Where-Object { $_.Subject -like '*Root*' -and $_.Issuer -eq $_.Subject } |
Select-Object -First 1
Export-Certificate -Cert $root -FilePath C:\certs\testroot.cer
# импорт в доверенные корневые (выполнить на ОБОИХ хостах)
Import-Certificate -FilePath C:\certs\testroot.cer `
-CertStoreLocation Cert:\LocalMachine\Root
Перенос сертификата хоста на второй сервер
$pwd = Read-Host -AsSecureString 'Пароль для PFX'
$cert = Get-ChildItem Cert:\LocalMachine\My |
Where-Object { $_.Subject -eq 'CN=hv2.lab.local' }
Export-PfxCertificate -Cert $cert -FilePath C:\certs\hv2.pfx -Password $pwd
Файл hv2.pfx копируем на HV2 и импортируем в личное хранилище компьютера:
Import-PfxCertificate -FilePath C:\certs\hv2.pfx `
-CertStoreLocation Cert:\LocalMachine\My -Password $pwd
На каждом хосте в личном хранилище должен остаться свой сертификат, а тестовый корневой — в доверенных корневых на обоих.
Шаг 3. Отключение проверки отзыва сертификата
Самоподписанные сертификаты не имеют точки распространения списка отзыва, поэтому проверку CRL нужно выключить — иначе репликация завершится ошибкой проверки сертификата. Выполняем на обоих хостах:
New-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Replication' -Force
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Replication' `
-Name 'DisableCertRevocationCheck' -Value 1 -Type DWord
Шаг 4. Настройка сервера-приёмника
На хосте, который будет принимать реплики (HV2), включаем приём по HTTPS с нашим сертификатом:
$thumb = (Get-ChildItem Cert:\LocalMachine\My |
Where-Object { $_.Subject -eq 'CN=hv2.lab.local' }).Thumbprint
Set-VMReplicationServer -ReplicationEnabled $true `
-AllowedAuthenticationType Certificate `
-CertificateAuthenticationPort 443 `
-CertificateThumbprint $thumb `
-ReplicationAllowedFromAnyServer $false `
-DefaultStorageLocation 'D:\Replica'
Разрешаем конкретный источник (безопаснее, чем ReplicationAllowedFromAnyServer):
New-VMReplicationAuthorizationEntry -AllowedPrimaryServer 'hv1.lab.local' `
-ReplicaStorageLocation 'D:\Replica' -TrustGroup 'LabGroup'
Открываем правило файрвола для входящей репликации по HTTPS:
Enable-NetFirewallRule -DisplayName 'Hyper-V Replica HTTPS Listener (TCP-In)'
Если реплики планируются в обе стороны (часть ВМ на одном хосте, часть на другом), шаг 4 выполняется симметрично на обоих хостах — каждый становится и источником, и приёмником.
Шаг 5. Включение репликации для виртуальной машины
На хосте-источнике (HV1) для каждой ВМ:
Enable-VMReplication -VMName 'VM-APP01' `
-ReplicaServerName 'hv2.lab.local' `
-ReplicaServerPort 443 `
-AuthenticationType Certificate `
-CertificateThumbprint (Get-ChildItem Cert:\LocalMachine\My |
Where-Object { $_.Subject -eq 'CN=hv1.lab.local' }).Thumbprint `
-RecoveryHistory 4 -ReplicationFrequencySec 300
RecoveryHistory— сколько дополнительных точек восстановления хранить (0 — только последняя);ReplicationFrequencySec— интервал репликации: 30, 300 или 900 секунд.
Запускаем первичную синхронизацию:
Start-VMInitialReplication -VMName 'VM-APP01'
Контроль прогресса и состояния:
Measure-VMReplication -VMName 'VM-APP01' |
Format-List Name, State, Health, LReplTime, PrimaryServerName, ReplicaServerName
Здоровая репликация — Health: Normal, State: Replicating.
Шаг 6. Проверка отработки
Не дожидаясь аварии, убедитесь, что реплика запускается. Тестовая отработка поднимает копию ВМ в изолированной сети и не влияет на продуктив:
# на хосте-приёмнике
Start-VMFailover -VMName 'VM-APP01' -AsTest -Confirm:$false
# ...проверили, что ОС загрузилась и службы работают...
Stop-VMFailover -VMName 'VM-APP01'
Start-VMFailoverбез ключа-AsTestвыполняет реальную отработку отказа: реплика становится рабочей ВМ, а репликация с источника останавливается. Для регулярных проверок используйте только-AsTest.
Типовые проблемы
| Симптом | Причина и решение |
|---|---|
Не удалось проверить сертификат / ошибка отзыва |
Не выполнен шаг 3 (DisableCertRevocationCheck) либо корневой сертификат не в доверенных корневых на обеих сторонах |
Не удалось подключиться к серверу-реплике |
Закрыт порт 443, не включено правило файрвола, имя хоста не резолвится (проверьте hosts и Test-NetConnection) |
Сертификат не найден при Enable-VMReplication |
Сертификат лежит в хранилище пользователя, а не компьютера (Cert:\LocalMachine\My), либо не совпадает CN с полным именем хоста |
| Репликация не включается для ВМ | У виртуальной машины есть контрольные точки — удалите их |
Health: Warning, растёт отставание |
Не хватает пропускной способности или места на приёмнике; увеличьте интервал репликации |
Связанные статьи
- Hyper-V — конвертация виртуальной машины из Gen 1 в Gen 2
- Добавление хоста Hyper-V в Veeam — Access is denied 0x00000005
- Veeam B&R — установка и создание задания резервного копирования — репликация не заменяет резервное копирование