Почему мое VPN-соединение типа «сеть-сеть» между Windows Server 2019 и Azure внезапно не маршрутизируется? - PullRequest
0 голосов
/ 11 апреля 2020

У нас сегодня странная проблема, вызванная неожиданным отключением питания в нашем офисе, когда мы все работаем удаленно. После отправки сообщения о перезапуске оборудования наше офисное соединение inte rnet восстановилось, и мы смогли подключиться к некоторым услугам, но наша сеть Site-to-Site (S2S) VPN между нашей офисной сетью и облаком больше не работает. , Странно то, что Azure указывает, что VPN «подключен», и - после некоторого творческого туннелирования - я смог подтвердить, что Windows Сервер 2019 в офисе также указывает на соединение как «Подключен», так что это похоже на проблему маршрутизации. Эта VPN работала безупречно в течение 10 месяцев, через перезагрузки и Windows Обновления, и все же сегодня она по необъяснимым причинам отключена.

Теперь немного истории: еще в июне 2019 года мы установили S2S VPN между нашими офисами в Лос-Анджелесе и ресурсы в Azure. Цель состояла в том, чтобы начать использовать Windows Virtual Desktop на Azure для виртуальных рабочих столов удаленных сотрудников, предоставляя им доступ к тем же ресурсам, что и сотрудники на месте. Тогда мы запустили следующий скрипт PowerShell на контроллере домена в Лос-Анджелесе, чтобы настроить Windows Сервер 2019 с S2S VPN на Azure:

Install-WindowsFeature Routing, RemoteAccess, RSAT-RemoteAccess-PowerShell

# Only needed if "RestartNeeded" is "Yes"
# Restart-Computer

# After the machine reboots. Launch PowerShell again to resume the configuration
Install-RemoteAccess -VpnType VpnS2S

# Setting variables
$rrasInterfaceName     = "Azure (vpn-subnet-to-la)"
$azureGatewayIpAddress = "12.74.131.73"
$virtualNetworkRange   = "10.3.0.0/16"
$sharedKey             = "redacted-psk"

Function Invoke-WindowsApi(
    [string] $dllName,
    [Type] $returnType,
    [string] $methodName,
    [Type[]] $parameterTypes,
    [Object[]] $parameters
    )
{
  ## Begin to build the dynamic assembly
  $domain = [AppDomain]::CurrentDomain
  $name = New-Object Reflection.AssemblyName 'PInvokeAssembly'
  $assembly = $domain.DefineDynamicAssembly($name, 'Run')
  $module = $assembly.DefineDynamicModule('PInvokeModule')
  $type = $module.DefineType('PInvokeType', "Public,BeforeFieldInit") 

  $inputParameters = @() 

  for($counter = 1; $counter -le $parameterTypes.Length; $counter++)
  {
     $inputParameters += $parameters[$counter - 1]
  } 

  $method = $type.DefineMethod($methodName, 'Public,HideBySig,Static,PinvokeImpl',$returnType, $parameterTypes) 

  ## Apply the P/Invoke constructor
  $ctor = [Runtime.InteropServices.DllImportAttribute].GetConstructor([string])
  $attr = New-Object Reflection.Emit.CustomAttributeBuilder $ctor, $dllName
  $method.SetCustomAttribute($attr) 

  ## Create the temporary type, and invoke the method.
  $realType = $type.CreateType() 

  $ret = $realType.InvokeMember($methodName, 'Public,Static,InvokeMethod', $null, $null, $inputParameters) 

  return $ret
}

Function Set-PrivateProfileString(
    $file,
    $category,
    $key,
    $value)
{
  ## Prepare the parameter types and parameter values for the Invoke-WindowsApi script
  $parameterTypes = [string], [string], [string], [string]
  $parameters = [string] $category, [string] $key, [string] $value, [string] $file

  ## Invoke the API
  [void] (Invoke-WindowsApi "kernel32.dll" ([UInt32]) "WritePrivateProfileString" $parameterTypes $parameters)
}

# Add and configure S2S VPN interface for VNet1
Add-VpnS2SInterface -Protocol IKEv2 -AuthenticationMethod PSKOnly -ResponderAuthenticationMethod PSKOnly `
 -Name $rrasInterfaceName -Destination $azureGatewayIpAddress -IPv4Subnet @("$($virtualNetworkRange):256")`
 -NumberOfTries 3 -SharedSecret $sharedKey

Set-VpnServerIPsecConfiguration -EncryptionType MaximumEncryption

# default value for Windows 2012 is 100MB, which is way too small. Increase it to 32GB.
Set-VpnServerIPsecConfiguration -SADataSizeForRenegotiationKilobytes 33553408

# TODO: Confirm why this setting is needed/what it does                                                                    
# Seems related to this: https://tools.ietf.org/html/draft-dukes-ikev2-config-payload-00
New-ItemProperty -Path HKLM:\System\CurrentControlSet\Services\RemoteAccess\Parameters\IKEV2 -Name SkipConfigPayload -PropertyType DWord -Value 1 -Force

# Set S2S VPN connections to be persistent by editing the router.pbk file (required admin priveleges)note that the IdelDisconnectSeconds and RedialOnLinkFailure are set for reach adaptors.
Set-PrivateProfileString $env:windir\System32\ras\router.pbk "$($rrasInterfaceName)" "IdleDisconnectSeconds" "0"
Set-PrivateProfileString $env:windir\System32\ras\router.pbk "$($rrasInterfaceName)" "RedialOnLinkFailure" "1"

# Restart the RRAS service
Restart-Service RemoteAccess

Connect-VpnS2SInterface -Name $rrasInterfaceName

route -p ADD 10.1.0.0 MASK 255.255.0.0 10.3.0.1 IF 30

Правило маршрутизации stati c в конце гарантирует, что пакеты, предназначенные для машин Windows Virtual Desktop в диапазоне 10.1.0.x, будут маршрутизироваться через шлюз на другой стороне S2S VPN в 10.3.0.1. S2S VPN VNet подключен к VNet, к которому подключен WVD.

Опять же, хочу подчеркнуть, что мы не внесли никаких изменений ни в Azure VPN, ни в конфигурацию сервера с момента его настройки в июне.

Таблица маршрутизации выглядит следующим образом:

===========================================================================
Interface List
 15...6c 4b 90 21 ab 9b ......Intel(R) Ethernet Connection (2) I219-LM
 27...........................Azure (vpn-subnet-to-la)
  1...........................Software Loopback Interface 1
===========================================================================

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0  192.168.100.254    192.168.100.1    281
         10.3.0.0      255.255.0.0         On-link      169.254.0.27    281
     10.3.255.255  255.255.255.255         On-link      169.254.0.27    281
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    331
      169.254.0.0      255.255.0.0         On-link      169.254.0.27    281
     169.254.0.27  255.255.255.255         On-link      169.254.0.27    281
  169.254.255.255  255.255.255.255         On-link      169.254.0.27    281
    192.168.100.0    255.255.255.0         On-link     192.168.100.1    281
    192.168.100.1  255.255.255.255         On-link     192.168.100.1    281
  192.168.100.255  255.255.255.255         On-link     192.168.100.1    281
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    331
        224.0.0.0        240.0.0.0         On-link     192.168.100.1    281
        224.0.0.0        240.0.0.0         On-link      169.254.0.27    281
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    331
  255.255.255.255  255.255.255.255         On-link     192.168.100.1    281
  255.255.255.255  255.255.255.255         On-link      169.254.0.27    281
===========================================================================
Persistent Routes:
  Network Address          Netmask  Gateway Address  Metric
         10.1.0.0      255.255.0.0         10.3.0.1       1
          0.0.0.0          0.0.0.0  192.168.100.254  Default
===========================================================================

IPv6 Route Table
===========================================================================
Active Routes:
 If Metric Network Destination      Gateway
  1    331 ::1/128                  On-link
 15    281 fe80::/64                On-link
 15    281 fe80::6430:2788:424f:47fb/128
                                    On-link
  1    331 ff00::/8                 On-link
 15    281 ff00::/8                 On-link
===========================================================================
Persistent Routes:
  None

Основные характеристики:

  • 192.168.100.1 - это контроллер домена, который обеспечивает VPN-подключение к Azure.
  • 192.168.100.254 - это маршрутизатор с целым rnet.
  • Шлюзом по умолчанию для D C является 192.168.100.254 (поэтому по умолчанию D C направляет трафик c к inte rnet через маршрутизатор).
  • Сеть настроена на получение аренды DHCP от D C, а не от маршрутизатора.
  • D C настроен на выдачу DHCP-аренды, которая использует D C в качестве шлюза по умолчанию, так что пакеты из остальной части офисной сети, предназначенные для облака go через VPN, в то время как пакеты предназначены. для inte rnet перенаправляются на маршрутизатор.

При такой конфигурации inte rnet traffi c работает нормально. Все в офисной сети может достичь inte rnet просто отлично. Но облако не может получить доступ к чему-либо в локальной сети и наоборот.

Вот что сервер указывает на состояние интерфейса S2S:

Get-VpnS2SInterface -Name "Azure (vpn-subnet-to-la)"

RoutingDomain   Name                 Destination          AdminStatus  ConnectionState IPv4Subnet
-------------   ----                 -----------          -----------  --------------- ----------
 -              Azure (vpn-subnet... {12.74.131.73}       True         Connected       {10.3.0.0/16:256}

Вот маршрут трассировки, показывающий что трафик c, предназначенный для облака, неправильно маршрутизируется через маршрутизатор:

tracert 10.1.2.7

Tracing route to 10.1.2.7 over a maximum of 30 hops

  1    <1 ms    <1 ms    <1 ms  dsldevice.attlocal.net [192.168.100.254]
  2     *     *     *
  3     *     *     *

Почему Windows не маршрутизируется через правильный интерфейс?

1 Ответ

0 голосов
/ 11 апреля 2020

Похоже, что неожиданное отключение питания вызвало Windows для повторной инициализации интерфейса S2S, чтобы у него был другой идентификатор интерфейса. Обратите внимание, что в исходном скрипте, который я запускал в июне, номер интерфейса был 30.

Но когда я удалил маршрут stati c и заново его добавил, я получил:

route delete 10.1.0.0
route -p ADD 10.1.0.0 MASK 255.255.0.0 10.3.0.1 IF 30

The route addition failed: The system cannot find the file specified.

Это побудило меня просмотреть список интерфейсов в верхней части route print output:

===========================================================================
Interface List
 15...6c 4b 90 21 ab 9b ......Intel(R) Ethernet Connection (2) I219-LM
 27...........................Azure (vpn-subnet-to-la)
  1...........................Software Loopback Interface 1
===========================================================================

Обратите внимание, что теперь номер интерфейса 27. Итак, я запустил:

route -p ADD 10.1.0.0 MASK 255.255.0.0 10.3.0.1 IF 27
 OK!

Теперь, когда я запускаю трассировку маршрута:

tracert 10.1.2.7

Tracing route to 10.1.2.7 over a maximum of 30 hops

  1    <1 ms    <1 ms    <1 ms  server.subdomain.mydomain.com [192.168.100.1]
  2    34 ms    33 ms    35 ms  10.1.2.7

Trace complete.
...