Trochę czasu minęło od ostatniego wpisu – uczyłem się do kolejnych egzaminów MS (tym razem do certyfikatu MCSA: Windows Server 2012). Teraz jak już jestem po egzaminie chciałbym pokazać jak utworzyć połączenie VPN point-to-site między komputerem a Azure’m. Scenariuszy wykorzystania takiego połączenia jest wiele, w każdym razie po zestawieniu VPN’a będziemy mieli dwustronną łączność między maszynami wirtualnymi w chmurze a dowolnymi komputerami, które są podłączone do Internetu i mają oczywiście zainstalowanego klienta do połączenia. Ale zanim do tego dojdzie trzeba przejść poniższą ścieżkę niezbędnej konfiguracji.
Utworzenie nowej sieci wirtualnej w Azure i połączenia point-to-site
Zacznijmy od zadeklarowania następujących stałych (a może zmiennych?), których będziemy używać przy wykonywaniu poszczególnych komend Powershell. Dzięki temu będziemy mogli korzystać z nich zamiast z długich zapisów adresacji sieci, itp. UWAGA: Nazwa podsieci GatewaySubnet musi się tak nazywać w przeciwnym razie VPN nie zadziała!
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$VNetName = "P2SVNet" $DefSubnetName = "default" $GWSubnetName = "<strong>GatewaySubnet</strong>" $VNetPrefix = "192.168.0.0/16" $DefSubnetPrefix = "192.168.1.0/24" $GWSubnetPrefix = "192.168.100.0/26" $VPNClientAddressPool = "172.16.201.0/24" $RG = "VPNTestRG" $Location = "West Europe" $DNS = "8.8.8.8" $GWName = "GW" $GWIPName = "GWIP" $GWIPconfName = "gwipconf" |
Teraz możemy przejść do zasadniczej części całego przedsięwzięcia. Stwórzmy nową grupę zasobów:
1 2 3 4 5 6 7 |
New-AzureRmResourceGroup -Name $RG -Location $Location ResourceGroupName : VPNTestRG Location : westeurope ProvisioningState : Succeeded Tags : ResourceId : /subscriptions/ba12e653-f6e7-4af0-94a9-a4201886c400/resourceGroups/VPNTestRG |
Następnie utwórzmy podsieci dla nowej sieci wirtualnej. W tym momencie przydadzą się stałe, które zadeklarowaliśmy na samym początku. Musimy utworzyć jeden subnet dla podsieci default oraz jeden dla GatewaySubnet:
1 2 |
$defsub = New-AzureRmVirtualNetworkSubnetConfig -Name $DefSubnetName -AddressPrefix $DefSubnetPrefix $gwsub = New-AzureRmVirtualNetworkSubnetConfig -Name $GWSubnetName -AddressPrefix $GWSubnetPrefix |
Podsieci możesz utworzyć tyle ile chcesz, pamiętając by była chociaż jedna ogólna – w której będziemy tworzyć maszyny wirtualne i jedna dla GatewaySubnet – w której będą znajdować się klienci łączący się do VPN. Jeśli jednak chcesz mieć więcej podsieci np. jedną dla serwerów Windows i drugą dla Linuxa nic nie stoi na przeszkodzie.
W nowej grupie zasobów tworzymy nową sieć wirtualną przy wykorzystaniu podsieci, które utworzyliśmy we wcześniejszym kroku.
1 |
New-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $RG -Location $Location -AddressPrefix $VNetPrefix -Subnet $defsub, $gwsub -DnsServer $DNS |
W odpowiedzi powinniśmy dostać obszerną informację że sieć wraz z podsieciami została utworzona. O tym fakcie świadczyć będą wpisy (w moim przypadku były trzy – jeden dla sieci wirtualnej i dwa dla podsieci default oraz GatewaySubnet):
1 |
"ProvisioningState": "Succeeded" |
Teraz jakbyśmy zalogowali się do portalu Azure zobaczylibyśmy nową grupę zasobów VPNTestRG zawierającą jeden zasób w postaci sieci wirtualnej P2SVnet o podsieciach:
- default: 192.168.1.0/24
- GatewaySubnet 192.168.100.0/26
Zmapujmy konfigurację nowo utworzonej sieci wirtualnej i podsieci GatewaySubnet do zmiennych:
1 2 |
$vnet = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $RG $gwsubnet = Get-AzureRmVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet |
Następnie tworzymy konfigurację publicznego adresu IP dla podsieci GatewaySubnet. Bez tego brama VPN nie będzie działać.
1 2 |
$publicip = New-AzureRmPublicIpAddress -Name $GWIPName -ResourceGroupName $RG -Location $Location -AllocationMethod Dynamic $ipconf = New-AzureRmVirtualNetworkGatewayIpConfig -Name $GWIPconfName -Subnet $gwsubnet -PublicIpAddress $publicip |
W tym momencie w portalu Azure możemy zobaczyć nowy zasób GWIP w grupie VPNTestRg. Tu będzie przechowywany publiczny adres IP dla bramy VPNa.
Żeby móc łączyć stacje klienckie do tworzonego VPNa potrzebny będzie certyfikat którym będziemy uwierzytelniać połączenie. Aby utworzyć certyfikat można wykorzystać narzędzie makecert.exe – jeśli korzystasz z Visual Studio to powinno być dostępne po uruchomieniu linii komend Visual Studio, ewentualnie makecert.exe jest częścią pakietu Windows Software Development Kit (SDK):
Ponieważ mam już u siebie zainstalowane Visual Studio, odpalam Developer Command Prompt i wydaję polecenie:
1 |
makecert -sky exchange -r -n "CN=P2SVPNRootCertificate" -pe -a sha1 -len 2048 -ss My "P2SVPNRootCertificate.cer" |
Certyfikat utworzy się w miejscu z którego wykonywaliśmy powyższą komendę np. na dysku C. Teraz trzeba otworzyć plik certyfikatu, przejść do zakładki Details i wybrać Copy to File…
Następnie wybieramy Base-64 encoded X.509 (.CER). Wybieramy ścieżkę zapisu i klikamy Finish. Teraz otwieramy nowo zapisany plik (u mnie P2SVPNRootCert.cer) edytorem tekstu i kopiujemy wszystko pomiędzy —–BEGIN CERTIFICATE—– a —–END CERTIFICATE——
Cały ten string możemy sobie zachować dla ułatwienia w zmiennej w Powershell. Uwaga: string po otwarciu w notatniku jest oddzielony znakami końca linii więc trzeba go przekopiować i wyedytować tak aby całość zawierała się w jednej linijce.
1 2 3 4 5 |
$p2sVPNazure = "MIIDFzCCAgOgAwIBAgIQu4TBBiBOJLxG8nRTLww7VDAJBgUrDgMCHQUAMCAxHjAcBgNVBAMTFVAyU1ZQTlJvb3RDZXJ0aWZpY2F0ZTAeFw0xNjAzMDMxMjA5MzZaFw0zOTEyMzEyMzU5NTlaMCAxHjAcBgNVBAMTFVAyU1ZQTlJvb3RDZXJ0aWZpY2F0ZTCCASIwDQYJKo ZIhvcNAQEBBQADggEPADCCAQoCggEBAMrjnmcN1qXpGvWDzukYMmqVMeg6x3RIG4rMlNcSPnqwtdtrVPmQB/DKXaiX9E7scFw6YLzwq1T/ufU2nKP+XOUQbGzH/BrpsoViFXMMCphaufcQXEf9wfV/RGpMqQzR/FDD6VobuAUk3k1plYFv6QIVA2HMZXcvQsrxGdBQJzNuTXT6bTE3SKI8h8ga7MajgfYMZcBabPta8W3BvU IF3vZF5kKaPqKGDRT+KjIZBpN1YHa2u+zYhagIO7/g60Xpab6mFbifI8lhk67MPWKE9fCxpKMh9+L84GPee2R4UirwkzbbZx4Nnf/I4HxUJyLQNjue0da8GCU8tmkNWGfSMv8CAwEAAaNVMFMwUQYDVR0BBEowSIAQLCk9cCWUscFi/kaljPSAZaEiMCAxHjAcBgNVBAMTFVAyU1ZQTlJvb3RDZXJ0aWZpY2F0ZYIQu4TBBi BOJLxG8nRTLww7VDAJBgUrDgMCHQUAA4IBAQAdmhTIqeyRJCYuge9dWJd36JNyb+5l1b+rMC4uzk05P37pe4MUB7RX7s+yyKJTqmTtmchwspvRKqzIF4fxrYOe2uLWnizFCZoLJ7CWPfOT54wUBmkkbvRaG3pfy28PTXskQEmj/d7wJ3Jg+jNPuBpNwue/bWi2I1IJwPVk2NF+iC0oZdkxSVxt5nbmucv8pfGI5RYLjOqk8r wqxhczMnyM5bfAVoZ1LX3d9WmT8GwbtTASiOM6kM57PXC9xWkc9MzI1fhqj+6W5NFy+6GGckabuHpT0VFQBBuULdK+/EUQ2Kd94GZu3zPohgzCSGHjcnWsbtmEUxpEGUMvBuCVAIPf" |
Teraz wypadałoby w końcu wgrać nasz root certificate do Azure’a. Robimy to poprzez komendę New–AzureRmVpnClientRootCertificate. UWAGA: po parametrze -Name podajemy nazwę pliku z którego kopiowaliśmy powyższy string.
1 |
$p2srootcert = New-AzureRmVpnClientRootCertificate -Name "P2SVPNRootCert.cer" -PublicCertData $p2sVPNazure |
Mając certyfikat tworzymy wirtualną bramę jako GatewayType podając Vpn i jako VpnType podając RouteBased.
1 |
New-AzureRmVirtualNetworkGateway -Name $GWName -ResourceGroupName $RG -Location $Location -IpConfigurations $ipconf -GatewayType Vpn -VpnType RouteBased -EnableBgp $false -GatewaySku Standard -VpnClientAddressPool $VPN ClientAddressPool -VpnClientRootCertificates $p2srootcert |
Może się chwilę zejść więc masz czas na kawę/herbatę/co tam chcesz 😉 Na koniec w każdym razie Powershell wypluje obszerną informację zawierającą dane nowej bramy, a w grupie zasobów w portalu Azure obok zasobów sieci wirtualnej i publicznego adresu IP powinien pojawić się nowy zasób wirtualnej bramy sieciowej. Tak to wygląda u mnie:
Konfiguracja klienta do połączenia z VPN Azure
Teraz pozostało nam ściągnąć klienta do połączeń VPN z nowo utworzoną grupą zasobów. Służy do tego komenda Get-AzureRmVpnClientPackage, która generuje link do pobrania paczki konfiguracyjnej na komputer o danej architekturze. Korzystam z kompa z procesorem x64 dlatego u mnie komenda wygląda następująco:
1 |
Get-AzureRmVpnClientPackage -ResourceGroupName $RG -VirtualNetworkGatewayName $GWName -ProcessorArchitecture "Amd64" |
Dla systemów 32bitowych należy zamiast „Amd64” podać „x86”.
Tak czy inaczej w odpowiedzi powinniśmy dostać link, który należy skopiować i po prostu wkleić w przeglądarkę. Ściągnie się plik .exe, który instalujemy. Doda on połączenie VPN w połączeniach sieciowych PCta, ale zanim z niego skorzystamy musimy jeszcze wygenerować i zainstalować u siebie certyfikat klienta do uwierzytelnienia połączenia.
Do wygenerowania certyfikatu klienta z linii komend wystarczy odpalić poniższą komendę zastępując P2SVPNRootCertificate nazwą certyfikatu root którą użyliśmy przy jego tworzeniu. W moim przypadku komenda będzie wyglądać następująco (P2SVPNClientCertificate to nazwa nowo tworzonego certyfikatu klienta):
1 |
makecert.exe -n "CN=P2SVPNClientCertificate" -pe -sky exchange -m 96 -ss My -in "P2SVPNRootCertificate" -is my -a sha1 |
Teraz po uruchomieniu certmgr.exe z linii komend w kontenerze Personal – Certificates powinien pojawić się certyfikat P2SVPNClientCertificate. Klikamy na nim prawym przyciskiem i wybieramy All Tasks – Export…
W kreatorze zaznaczamy opcję Yes, export the private key, i przechodzimy dalej zostawiając wartości domyślne. W pewnym momencie trzeba będzie podać hasło do zabezpieczenia certyfikatu i ścieżkę zapisu. Po zakończeniu pracy z kreatorem mamy gotowy certyfikat pfx, który musimy zainstalować na wszystkich komputerach, które będą łączyć się VPNem do Azure’a.
Łączmy się!
Jeśli mamy już zainstalowany certyfikat kliencki oraz paczkę konfiguracyjną do łączenia się z naszą siecią wirtualną w Azure możemy już nawiązać połączenie. W tym celu wchodzimy w listę dostępnych połączeń sieciowych i wybieramy połączenie o nazwie utworzonej sieci wirtualnej. Klikamy Connect.
Jeśli dostaniemy powiadomienie o konieczności uruchomienia połączenia w trybie administratora klikamy Continue. Dalej z listy wybieramy certyfikat kliencki, który zainstalowaliśmy wcześniej i klikamy OK.
I już połączenie powinno hulać 🙂
Możemy to jeszcze sobie sprawdzić wpisując w linii komend ipconfig /all. Na liście konfiguracji adapterów powinno pojawić się miedzy innymi coś w stylu:
1 2 3 4 5 6 7 8 9 10 11 |
PPP adapter P2SVNet: Connection-specific DNS Suffix . : Description . . . . . . . . . . . : P2SVNet Physical Address. . . . . . . . . : DHCP Enabled. . . . . . . . . . . : No Autoconfiguration Enabled . . . . : Yes IPv4 Address. . . . . . . . . . . : 172.16.201.2(Preferred) Subnet Mask . . . . . . . . . . . : 255.255.255.255 Default Gateway . . . . . . . . . : NetBIOS over Tcpip. . . . . . . . : Enabled |
Jak widać dostaliśmy adres IP z puli adresów klientów VPN, które określiliśmy sobie na samym początku w Powershell pod stałą $VPNClientAddressPool.
Gratulacje! 🙂
Teraz możesz tworzyć maszyny wirtualne korzystające z tej skonfigurowanej do połączeń VPN grupy zasobów i mieć z nimi bezpośrednie połączenie ze swojego komputera. W ramach ćwiczeń możesz spróbować utworzyć VPN point-to-site dla już istniejącej grupy zasobów, która np. zawiera już jakieś maszyny wirtualne. Powodzenia!