Instalacja i konfiguracja OpenVPN w Windows

OpenVPN to działający w oparciu o protokół SSL program do zestawiana wirtualnych sieci prywatnych. Niewątpliwą zaletą programu jest dostępność odpowiednich pakietów dla wielu systemów operacyjnych. Przedstawiona dalej instrukcja instalacji i konfiguracji przewidziana jest dla systemów Windows. Przed rozpoczęciem konfiguracji należy podjąć kilka decyzji. W jakim trybie będzie działał OpenVPN? Jaki wybrać sposób uwierzytelniania klientów? Jaki protokół transportowy wybrać dla potrzeb tunelu?
OpenVPN (a właściwie jego wirtualny interfejs sieciowy) może działać w jednym z dwóch trybów - routowania (tun) oraz w trybie mostkowania, czyli bridge (tap):
  • Tryb routowania - używany w przypadku konfiguracji typu brama + wielu klientów lub brama-brama. Po podłączeniu otrzymujemy adres z innej podsieci, niż ta docelowa, przez co przynależymy do osobnej domeny rozgłoszeniowej. Przykładem wykorzystania tego trybu jest łączenie się z firmą pracowników zdalnych.
  • Tryb bridge - używany w przypadku łączenia kilku sieci. W tym przypadku między sieciami przekazywany jest cały ruch, łącznie z broadcastem (pakietami rozgłoszeniowymi), co może prowadzić do nadmiernego obciążenia tunelu VPN niepotrzebnym ruchem. Przykładem wykorzystania tego trybu jest połączenie pomiędzy oddziałem firmy a centralą.
Drugą ważną kwestią jest sposób uwierzytelniania klientów - z użyciem pliku klucza współdzielonego czy z użyciem certyfikatów SSL:
  • Uwierzytelnianie poprzez klucz współdzielony (ang. Pre-Shared Key - PSK) - użycie pliku klucza jest najprostszym i najszybszym rozwiązaniem, ale ogranicza się praktycznie do jednego urządzenia-klienta, a w przypadku przejęcia klucza (który trzymany jest w formie niezaszyfrowanej) oznacza ryzyko rozkodowania transmisji. Metoda nadaje się najlepiej do zestawiania połączeń punkt-punkt czyli dwóch sieci, np. oddziału firmy z centralą.
  • Uwierzytelnianie w oparciu o certyfikaty SSL - wymaga wygenerowania głównego certyfikatu oraz klucza, w oparciu o które będziemy mogli generować certyfikaty dla serwerów i klientów. Metoda stosowana w przypadku dużej, zmieniającej się grupy osób, czyli znakomicie nadaje się do tworzenia zdalnego dostępu dla pracowników.
Kolejną istotną decyzją jest wybór protokołu transportowego - TCP czy UDP:
  • TCP - jest protokołem połączeniowym umożliwiającym wykrywanie błędów transmisji. Jednak właśnie przez sposób działania może spowodować spadek wydajności zestawionego tunelu a nawet całkowite zapchanie łącza.
  • UDP - jest protokołem, który nie zapewnia mechanizmu kontroli przesyłanych pakietów oraz mechanizmu potwierdzeń. Jednak z uwagi na szybkość i brak występowania zjawiska "niekończącej się retransmisji" zaleca się właśnie używanie protokołu UDP.
Instalacja OpenVPN w Windows
Najnowszą wersje pakietu OpenVPN można pobrać ze strony www.openvpn.net i zainstalować posiadając prawa Administratora. Instalacja programu jest prosta i wymaga jedynie zatwierdzania domyślnych ustawień proponowanych podczas procesu instalacji (jeżeli będzie wykorzystywane połączenie z wykorzystaniem certyfikatów SSL - generowanych przez własne centrum certyfikacji - należy zwrócić uwagę, żeby była zaznaczona opcja "EasyRSA 2 Certificate Management Scripts"). Pakiet instalacyjny oprócz właściwego programu, zainstaluje również sterownik wirtualnego interfejsu TAP oraz graficzną nakładkę OpenVPN GUI.
OpenVPN GUI dostępny jest na pasku zadań (w zasobniku systemowym, obok zegara) w postaci ikonki sygnalizującej zmieniającymi się kolorami aktualny stan tunelu: żółty - tunel zainicjowany z jednej strony; zielony - tunel aktywny, w pełni funkcjonalny. Dodatkowo po kliknięciu prawym przyciskiem myszki na ikonce, otwiera się menu, w którym mamy dostęp do skonfigurowanych przez nas połączeń, co stanowi wygodne narzędzie do administrowania nimi.
Połączenie z wykorzystaniem współdzielonego klucza
Uwaga - częstym problemem podczas generowania pliku z kluczem jest brak odpowiednich uprawnień umożliwiających zapis do katalogu instalacyjnego. Zmianę uprawnień można dokonać we właściwościach katalogu, w którym jest zainstalowany OpenVPN.
Generowanie klucza współdzielonego
Do połączeń typu punkt-punkt możemy zestawić tunel z uwierzytelnieniem opartym o współdzielony stały klucz znany obu stronom. W tym celu należy wygenerować klucz na serwerze. Otwieramy okno konsoli cmd (ang. Command Line) z uprawnieniami Administratora i przechodzimy do katalogu "bin", który znajduje się w miejscu instalacji OpenVPN, np.:
        cd c:\Program Files\OpenVPN\bin  
      
Wpisujemy polecenie:
        openvpn --verb 3 --genkey --secret secret.key
      
Generowanie współdzielonego klucza
Wygenerowany plik - secret.key - powinien znajdować się w katalogu "bin" (w miejscu instalacji OpenVPN). Należy go przenieść do katalogu "config" (w miejscu instalacji OpenVPN lub w katalogu użytkownika) po stronie serwera oraz skopiować na każdy łączący się komputer klienta (również do katalogu "config"). Do przenoszenia pliku z kluczem powinno się używać bezpiecznego kanału. Przejęcia klucza oznacza ryzyko rozkodowania transmisji.
Pliki konfiguracyjne
W katalogu "config" (w tej samej lokalizacji co plik secret.key) na serwerze tworzymy plik konfiguracyjny server.ovpn, który będzie miał postać:
		  dev tun                         # dla trybu routowania podajemy "tun"
		  local 192.168.79.133            # adres IP serwera (przeczytaj dodatkowe uwagi na dole strony)
										  # "local" określa tryb pracy tego końca tunelu jako serwer
		  proto udp4                      # rodzaj wykorzystywanego protokołu (w tym przypadku UDP IPv4)
		  port 1194                       # używany port
		  ifconfig 10.3.0.1 10.3.0.2      # adres IP serwera, adres IP klienta (dla utworzonego połączenia)
		  secret secret.key               # nazwa pliku z kluczem            
										  # można podać pełną ścieżke, np.: 
										  # secret "c:\\Program Files\\OpenVPN\\config\\secret.key"
		  persist-tun                     # podczas restartu utrzymuje podniesiony wirtualny interfejs
		  persist-key                     # podczas restartu nie będzie ponownie wczytany klucz
		  keepalive 10 120                # wysyła ping co 10 sekund z timeout=120s.
										  # restart w przypadku braku połączenia
		  ncp-disable                     # wyłączenie funkcji Negotiable Crypto Parameters (NCP)										  
		  cipher AES-256-CBC              # ustawienie szyfrowania AES z kluczem długości 256 bitów i algorytmem CBC
										  # ustawienie musi być identyczne na kliencie i serwerze
		  auth-nocache					  # usunięcie danych uwierzytelniających z pamięci RAM									
		  comp-lzo                        # algorytm kompresji, zmniejsza zużycie transferu
		  verb 1                          # poziom szczegółowości logowania  
      
W katalogu "config" (w tej samej lokalizacji co plik secret.key) na kliencie tworzymy plik konfiguracyjny client.ovpn, który będzie miał postać:
		  dev tun                         # dla trybu routowania podajemy "tun"
		  remote 192.168.79.133           # adres IP serwera (przeczytaj dodatkowe uwagi na dole strony)
										  # "remote" określa tryb pracy tego końca tunelu jako klient
		  proto udp4                      # rodzaj wykorzystywanego protokołu (w tym przypadku UDP IPv4)
		  port 1194                       # używany port
		  ifconfig 10.3.0.2 10.3.0.1      # adres IP klienta, adres IP serwera (dla utworzonego połączenia)
		  secret secret.key               # nazwa pliku z kluczem            
										  # można podać pełną ścieżke, np.: 
										  # secret "c:\\Program Files\\OpenVPN\\config\\secret.key"
		  persist-tun                     # podczas restartu utrzymuje podniesiony wirtualny interfejs
		  persist-key                     # podczas restartu nie będzie ponownie wczytany klucz
		  keepalive 10 120                # wysyła ping co 10 sekund z timeout=120s.
										  # restart w przypadku braku połączenia
		  ncp-disable                     # wyłączenie funkcji Negotiable Crypto Parameters (NCP)
		  cipher AES-256-CBC              # ustawienie szyfrowania AES z kluczem długości 256 bitów i algorytmem CBC
										  # ustawienie musi być identyczne na kliencie i serwerze
		  auth-nocache					  # usunięcie danych uwierzytelniających z pamięci RAM
		  comp-lzo                        # algorytm kompresji, zmniejsza zużycie transferu
		  verb 1                          # poziom szczegółowości logowania 
      
Nawiązanie połączenia
Aby nawiązać połączenie, należy uruchomić serwer poprzez kliknięcie prawym przyciskiem myszki ikonki aplikacji OpenVPN GUI (w zasobniku systemowym, obok zegara) i z otwartego menu wybrać "Połącz", po czym powinniśmy zobaczyć okienko statusu połączenia. Następnie należy powtórzyć łączenie na stacjach klienckich.
OpenVPN GUI - status połączenia
Najprostszym sposobem weryfikacji poprawności połączenia (poza zielonym kolorem ikonki nakładki graficznej OpenVPN GUI), jest wysłanie "pinga" np. z klienta na serwer.
Połączenie z wykorzystaniem certyfikatów SSL
Uwaga - częstym problemem podczas wystawiania certyfikatów jest brak odpowiednich uprawnień umożliwiających zapis do katalogu instalacyjnego. Zmianę uprawnień można dokonać we właściwościach katalogu, w którym jest zainstalowany OpenVPN.
OpenVPN do stworzenia własnego zaufanego centrum certyfikacji (ang. Certrificate Authority - CA), generowania kluczy, wniosków i certyfikatów wykorzystuje biblioteki OpenSSL. Jest to wieloplatformowa, otwarta implementacja protokołów SSL/TLS oraz algorytmów kryptograficznych ogólnego przeznaczenia.
Początkowa konfiguracja OpenVPN - OpenSSL
W pierwszej kolejności, należy przygotować plik vars.bat, w którym znajdują się zmienne używane w następnych skryptach. Otwieramy okno konsoli cmd z uprawnieniami Administratora i przechodzimy do katalogu "easy-rsa" w miejscu instalacji OpenVPN i uruchamiamy plik init-config.bat, który utworzy plik vars.bat (skopiuje plik vars.bat.sample i zmieni jego nazwę na vars.bat):
        cd c:\Program Files\OpenVPN\easy-rsa
        init-config.bat
      
init-config.bat
Następnie należy dokonać edycji pliku vars.bat i zmienić odpowiednie linie skryptu na pasujące dla naszej lokalizacji. Dzięki tym zmianom skorzystamy z domyślnych podpowiedzi podczas generowania certyfikatów, co ułatwi ich wystawianie.
          set KEY_COUNTRY=PL
          set KEY_PROVINCE=Mazowieckie
          set KEY_CITY=Warszawa
          set KEY_ORG=IT Bridge
          set KEY_EMAIL=mail@host.domain
          set KEY_CN=changeme
          set KEY_NAME=changeme
          set KEY_OU=IT Bridge
      
Po zapisaniu zmian, należy uruchomić plik vars.bat w oknie konsoli.
Utworzenie własnego centrum certyfikacji
Kolejnym krokiem jest utworzenie własnego zaufanego centrum certyfikacji (CA). Dzięki temu będzie można wystawiać certyfikaty dla serwerów i klientów. Zaufanie do urzędu certyfikacji oznacza przekonanie, że dany urząd certyfikacji kieruje się właściwymi zasadami oceny żądań dotyczących certyfikatów. Ponieważ będziemy sami wystawiać certyfikaty - na własne potrzeby - można uznać je za zaufane. Najlepiej, żeby własne CA utworzyć na komputerze odłączonym od Internetu albo przynajmniej za firewallem, tak aby nie był on bezpośrednio widoczny w Internecie (zdecydowanie CA nie powinno być na tym samym komputerze, na którym działa serwer OpenVPN).
W otwartym wcześniej oknie konsoli cmd uruchamiamy plik clean-all.bat, który utworzy (jeżeli istnieje to najpierw usunie) katalog "keys" oraz pliki index.txt i serial (skopiuje pliki index.txt.start i serial.start oraz zmieni ich nazwę odpowiednio na index.txt i serial).
          clean-all.bat
      
clean-all.bat
Teraz generujemy certyfikat dla urzędu certyfikacji uruchamiając w konsoli plik build-ca.bat.
          build-ca.bat
      
W pliku tym ustawiony jest okres ważności certyfikatu na 10 lat. Można to zmienić modyfikując domyślną wartość parametu "days" (np. -days 365, ustawi okres ważności certyfikatu na rok). W trakcie generowania certyfikatu należy odpowiedzieć na kilka pytań. Dla większości można wykorzystać domyślne podpowiedzi (wystarczy wcisnąć enter), które zostały wcześniej ustawione podczas edycji pliku vars.bat. Należy pamiętać, żeby podczas wystawiania certyfikatów dla serwera i klientów udzielić takich samych odpowiedzi, przy czym w polu "Common Name" należy podawać unikatową nazwę, jednoznacznie określającą łączącą się osobę lub komputer.
build-ca.bat
Po wykonaniu skryptu w katalogu "keys" zostaną zapisane pliki ca.crt (certyfikat CA) oraz ca.key (klucz prywatny CA). Plik z certyfikatem należy skopiować do katalogu "config" (w miejscu instalacji OpenVPN lub w katalogu użytkownika) zarówno po stronie serwera jak i każdego łączącego się klienta.
Certyfikat dla serwera
W oknie konsoli cmd uruchamiamy plik build-key-server.bat z parametrem określającym jak mają się nazywać pliki z certyfikatem i kluczem, np.:
          build-key-server.bat server
      
Podobnie jak w przypadku certyfikatu CA, domyślny okres ważności certyfikatu serwera wynosi 10 lat i można go zmienić modyfikując wartość parametru "days" w pliku. W trakcie generowania certyfikatu będziemy proszeni o odpowiedzi na podobne pytania jak przy generowaniu certyfikatu CA, pamiętając, że dla pola "Common Name" należy podawać unikatową nazwę (np. jeżeli mamy firmową domenę, możemy przygotować adres w postaci vpn.nasza-domena.pl). Pola "A challenge password" (służy do zabezpieczenia żądania certyfikatu na czas wysyłki do podpisu w zewnętrznym centrum certyfikacji - my używamy swojego lokalnego) oraz "An optional company name" zostawiamy puste - bez odpowiedzi. Na koniec należy odpowiedzieć twierdząco na pytania dotyczące podpisania wystawianego certyfikatu. Po wykonaniu skryptu, w katalogu "keys", zostaną zapisane pliki server.crt (certyfikat serwera) oraz server.key (klucz prywatny serwera). Pliki należy skopiować na serwerze do katalogu "config" (w miejscu instalacji OpenVPN lub w katalogu użytkownika).
build-key-server.bat
Po stronie serwera należy utworzyć plik z parametrami algorytmu kryptograficznego Diffiego-Hellmana. Umożliwia on uzgodnienie stronom, znanego tylko im, wspólnego klucza do szyfrowania symetrycznego. W oknie konsoli cmd uruchamiamy skrypt build-dh.bat. Stworzy on plik dh2048.pem z kluczem o długości 2048 bitów (Czas generowania pliku zależy od mocy obliczeniowej komputera i może trwać nawet kilka minut), który należy skopiować do katalogu "config" (w tej samej lokalizacji co certyfikat i klucz prywatny serwera).
          build-dh.bat
      
build-dh.bat
Certyfikaty dla klientów
Dla każdego klienta należy przygotować osobny certyfikat. W oknie konsoli cmd uruchamiamy plik build-key.bat z parametrem określającym jak mają się nazywać pliki z certyfikatem i kluczem, np.:
          build-key.bat client1
      
Tutaj również domyślny okres ważności certyfikatu wynosi 10 lat i można go zmienić modyfikując wartość parametru "days" w pliku. Dla każdego generowanego certyfikatu będziemy proszeni o odpowiedzi na podobne pytania jak przy generowaniu certyfikatu CA i serwera. W polu "Common Name" należy podać unikatową nazwę dla każdego łączącego się klienta. Pola "A challenge password" oraz "An optional company name", podobnie jak przy generowaniu certyfikatu serwera, zostawiamy puste - bez odpowiedzi.
Na koniec należy odpowiedzieć twierdząco na pytania dotyczące podpisania wystawianego certyfikatu. Dzięki unikatowej nazwie podanej w polu "Common Name", będzie można rozpoznać podłączających się klientów i ustawić dla nich indywidualną konfigurację. Po wykonaniu skryptu, w katalogu "keys", zostaną zapisane pliki client1.crt (certyfikat klienta) oraz client1.key (klucz prywatny klienta). Pliki należy skopiować na kliencie do katalogu "config" (w miejscu instalacji OpenVPN lub w katalogu użytkownika).
build-key.bat
Pliki konfiguracyjne
W katalogu "config" na serwerze tworzymy plik konfiguracyjny server.ovpn, który będzie miał postać:
		  dev tun                         # dla trybu routowania podajemy "tun"
		  local 192.168.79.133            # adres IP serwera (przeczytaj dodatkowe uwagi na dole strony)
										  # "local" określa tryb pracy tego końca tunelu jako serwer
		  proto udp4                      # rodzaj wykorzystywanego protokołu (w tym przypadku UDP IPv4)
		  port 1194                       # używany port
		  server 10.8.0.0 255.255.255.0   # klasa adresowa z której będą przydzielane adresy IP
		  ca ca.crt                       # nazwa pliku z certyfikatem CA          
		  cert server.crt                 # nazwa pliku z certyfikatem serwera
		  key server.key                  # nazwa pliku z kluczem prywatnym serwera
		  dh dh2048.pem                   # nazwa pliku z parametrami algorytmu Diffiego-Hellmana  
										  # wszystkie ścieżki do plików mogą być podane jako bezwzględne, np.:
										  # "c:\\Program Files\\OpenVPN\\config\\ca.crt"
		  max-clients 100                 # maksymalna ilość jednocześnie podłączonych klientów
		  persist-tun                     # podczas restartu utrzymuje podniesiony wirtualny interfejs
		  persist-key                     # podczas restartu nie bedzie ponownie wczytany klucz
		  keepalive 10 120                # wysyła ping co 10 sekund z timeout=120s.
										  # restart w przypadku braku połączenia
		  cipher AES-256-CBC              # ustawienie zalecanego algorytmu szyfrowania
										  # ustawienie musi być identyczne na kliencie i serwerze
		  auth-nocache					  # usunięcie danych uwierzytelniających z pamięci RAM
		  comp-lzo                        # algorytm kompresji, zmniejsza zużycie transferu
		  verb 1                          # poziom szczegółowości logowania
      
W katalogu "config" na kliencie tworzymy plik konfiguracyjny client.ovpn, który będzie miał postać:
		  dev tun                         # dla trybu routowania podajemy "tun"
		  client                          # określa tryb pracy tego końca tunelu jako klient
		  remote 192.168.79.133           # adres IP serwera (przeczytaj dodatkowe uwagi na dole strony)
		  proto udp4                      # rodzaj wykorzystywanego protokołu (w tym przypadku UDP IPv4)
		  port 1194                       # używany port
		  nobind                          # nie otwiera portu po stronie klienta
		  ca ca.crt                       # nazwa pliku z certyfikatem CA          
		  cert client1.crt                # nazwa pliku z certyfikatem klienta
		  key client1.key                 # nazwa pliku z kluczem prywatnym klienta
										  # wszystkie ścieżki do plików mogą być podane jako bezwzględne, np.:
										  # "c:\\Program Files\\OpenVPN\\config\\ca.crt"
		  persist-tun                     # podczas restartu utrzymuje podniesiony wirtualny interfejs
		  persist-key                     # podczas restartu nie bedzie ponownie wczytany klucz
		  keepalive 10 120                # wysyła ping co 10 sekund z timeout=120s.
										  # restart w przypadku braku połączenia
		  cipher AES-256-CBC              # ustawienie zalecanego algorytmu szyfrowania
										  # ustawienie musi być identyczne na kliencie i serwerze
		  remote-cert-tls server		  # dodatkowa weryfikacja certyfikatu
		  auth-nocache					  # usunięcie danych uwierzytelniających z pamięci RAM
		  comp-lzo                        # algorytm kompresji, zmniejsza zużycie transferu
		  verb 1                          # poziom szczegółowości logowania
      
Każdy łączący się klient może ponadto posiadać specyficzne ustawienia zapisane w odrębnych plikach na serwerze. Poniższa opcja dodana do pliku konfiguracyjnego serwera wskazuje, że pliki z dodatkowymi ustawieniami znajdują się w katalogu "ccd". Pliki we wskazanym katalogu muszą mieć nazwy zgodne z polem "Common Name" certyfikatu klienta. Między innymi dlatego unikatowa nazwa dla pola "Common Name" certyfikatu SSL jest tak ważna. Można również użyć opcji ccd-exclusive, która powoduje że będą mogli łączyć się tylko i wyłącznie klienci, którzy mają utworzony dodatkowy plik z ustawieniami.
		  client-config-dir ccd           # katalog z plikami specyficznych ustawień klientów
		  ccd-exclusive                   # połączenie możliwe tylko dla "znanych" klientów, którzy mają utworzony
                                          # dodatkowy plik z ustawieniami w katalogu cdd
      
Dzięki odpowiednim wpisom w pliku z dodatkowymi ustawieniami klienta, można np. przypisać stały adres IP dla łączącego się użytkownika. Odpowiada za to instrukcja "ifconfig-push" po której podaje się adres klienta oraz adres serwera, np.:
		  ifconfig-push 10.8.0.6 10.8.0.5
      
Tutaj wymagane jest dodatkowe wyjaśnienie dotyczące podawanych adresów IP. OpenVPN dla każdego połączenia tworzy czteroadresową podsieć (maska podsieci: 255.255.255.252) – z czego dwa adresy są użyteczne dla hostów, pozostałe dwa to adres sieci i adres rozgłoszeniowy (broadcast). Przykładowo dla dwóch zestawionych połączeń wykorzystana adresacja może mieć postać:
		  Połączenie 1:
		  10.8.0.4 adres sieci
		  10.8.0.5 adres serwera
		  10.8.0.6 adres klienta
		  10.8.0.7 adres broadcast

		  Połączenie 2:
		  10.8.0.8 adres sieci
		  10.8.0.9 adres serwera
		  10.8.0.10 adres klienta
		  10.8.0.11 adres broadcast 
      
Poniżej znajduje się spis możliwych par adresów IP, które mogą być wykorzystane przez hosty.
		  [  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
		  [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
		  [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
		  [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
		  [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
		  [101,102] [105,106] [109,110] [113,114] [117,118]
		  [121,122] [125,126] [129,130] [133,134] [137,138]
		  [141,142] [145,146] [149,150] [153,154] [157,158]
		  [161,162] [165,166] [169,170] [173,174] [177,178]
		  [181,182] [185,186] [189,190] [193,194] [197,198]
		  [201,202] [205,206] [209,210] [213,214] [217,218]
		  [221,222] [225,226] [229,230] [233,234] [237,238]
		  [241,242] [245,246] [249,250] [253,254] 
      
Bardzo często można spotkać się z informacją, że za przydzielanie stałych adresów IP dla klientów odpowiada opcja "ifconfig-pool-persist" (umieszczona w pliku konfiguracyjnym serwera) z parametrem określającym nazwę pliku przechowującego wykorzystane adresy IP, np.:
		  ifconfig-pool-persist ipp.txt   # nazwa pliku zawierającego przydzielone adresy IP 
      
Jest to jednak plik pomocniczy, w którym OpenVPN przechowuje wyłącznie informacje, które adresy IP zostały już przydzielone. Nie gwarantuje natomiast, że po ponownym podłączeniu klient otrzyma ten sam adres IP.
Certyfiakty PKCS#12
Podczas przekazywania np. pracownikom zdalnym, plików z kluczem i certyfikatami, może się okazać, że bardziej preferowaną metodą będzie ich udostępnianie w postaci jednego certyfikatu w formacie PKCS#12. W poniższym poleceniu należy wskazać certyfikat użytkownika, klucz prywatny użytkownika, certyfikat CA oraz nazwę dla nowego pliku w formacie PKCS#12. Użyty w składni polecenia parametr "clcerst" wskazuje że utworzony certyfikat jest przeznaczony wyłączenie dla klienta. Podczas generowania certyfikatu zostaniemy poproszeni o hasło dla klucza prywatnego - możemy oczywiście nic nie wpisywać, wtedy podczas łączenia się nie będziemy o nie pytani.
Otwieramy okno konsoli cmd i przechodzimy do katalogu, w którym znajdują się wystawione certyfikaty oraz klucz prywatny klienta i wpisujemy:
          openssl pkcs12 -export -clcerts -in client1.crt -inkey client1.key -certfile ca.crt -out client1.p12
      
Dla nowych klientów, którzy nie posiadają jeszcze wydanego certyfikatu i klucza można użyć skryptu build-key-pkcs12.bat. Proces jego wydawania nie różni się niczym od tego opisywanego wcześniej. Należy odpowiedzieć na wyświetlone pytania, wyrazić zgodę na podpisanie wystawianego certyfikatu oraz na końcu podać hasło dla klucza prywatnego.
Otwieramy okno konsoli cmd i przechodzimy do katalogu "easy-rsa", który znajduje się w miejscu instalacji OpenVPN. Uruchamiamy skrypt build-key-pkcs12.bat z parametrem określającym nazwę wystawianego certyfikatu, np.:
          build-key-pkcs12.bat client2
      
W obu przypadkach utworzony plik z rozszerzeniem .p12 należy przegrać do katalogu konfiguracyjnego po stronie klienta. W pliku konfiguracyjnym należy zastąpić parametry określające certyfikat CA, certyfikat oraz klucz prywatny klienta na jeden parametr wskazujący nowy plik z certyfikatem w formacie PKCS#12.
          pkcs12 client1.p12              # nazwa pliku z certyfikatem w formacie PKCS#12
      
Zwiększenie bezpieczeństwa
W celu poprawy bezpieczeństwa dla każdego klucza prywatnego można ustawić hasło. Dzięki temu dostęp do serwera VPN będą mieli jedynie uprawnieni użytkownicy - hasło będzie trzeba podać w momencie próby zestawienia połączenia. Nie należy szyfrować klucza serwera, zwłaszcza jeżeli będzie on uruchamiany bez interakcji użytkownika, np. jako usługa. Poniższy przykład utworzy - a jeżeli istnieje, to zmieni - hasło dla klucza client1.key (hasło może mieć od 4 do 511 znaków). Hasło do klucza prywatnego można usunąć wykorzystując to samo polecenie, ale z pominięciem parametru "des3", który odpowiada za jego szyfrowanie algorytmem TripleDES.
          openssl rsa -in keys\client1.key -out keys\client1.key -des3
      
Ustawienie hasła dla klucza prywatnego
Jeżeli chcemy dla wszystkich klientów używać kluczy prywatnych z hasłem, to do generowania certyfikatów można użyć skryptu build-key-pass.bat. Wówczas podczas generowania certyfikatów na początku będziemy proszeni o podanie hasła dla klucza prywatnego (dalsza procedura jest analogiczna do tej opisanej w części "Certyfikaty dla klientów").
Dodatkowo poziom bezpieczeństwa serwera OpenVPN można podnieść wykorzystując klucz statyczny, który dodaje dodatkową warstwę zabezpieczenia. Klucz statyczny to losowo generowana liczba o określonej długości (w bitach), która musi znajdować się w identycznej formie na serwerze oraz komputerze klienta. Dzięki temu klient, który nie posiada pliku z kluczem statycznym nie jest w stanie nawiązać połączenia - pakiety zostają natychmiast odrzucone. Pozwala to zabezpieczyć się przed próbami wykorzystania błędów w implementacji TLS, czy atakami DoS, a także nie pozwala na wykrycie portu na którym nasłuchuje OpenVPN, ponieważ skaner rozpozna go jako zamknięty.
W oknie konsoli cmd wpisujemy poniższe polecenie, które wygeneruje plik z kluczem statycznym:
          openvpn --genkey --secret ta.key
      
Utworzony plik - ta.key - należy przenieść do katalogu "config" po stronie serwera oraz skopiować na każdy łączący się komputer klienta. Dodatkowo w pliku konfiguracyjnym na serwerze należy dodać poniższą opcję:
          tls-crypt ta.key 0               # nazwa pliku z kluczem statycznym
      
W pliku konfiguracyjnym na każdym łączącym się komputerze klienta należy dodać poniższą opcję:
          tls-crypt ta.key 1               # nazwa pliku z kluczem statycznym
      
Nawiązanie połączenia
Podobnie jak przy konfiguracji z kluczem współdzielonym, żeby nawiązać połączenie, należy uruchomić serwer poprzez kliknięcie prawym przyciskiem myszki ikonki aplikacji OpenVPN GUI i z otwartego menu wybrać "Połącz", po czym powinniśmy zobaczyć okienko statusu połączenia. Następnie należy powtórzyć łączenie na stacjach klienckich.
OpenVPN GUI - status połączenia na serwerze
Unieważnianie certyfikatów
W przypadku np. odejścia pracownika, czy kradzieży laptopa zachodzi potrzeba unieważnienia certyfikatu używanego do połączenia z serwerem VPN. Wykorzystywany jest przy tym plik index.txt (w katalogu "keys"), który zawiera wpisy o wszystkich wystawionych certyfikatach. Oprócz unieważnienia takiego certyfikatu, trzeba jeszcze rozpropagować informacje o tym. W tym celu generowane są listy certyfikatów unieważnionych (ang. Certificate Revocation List - CRL).
Otwieramy okno konsoli cmd i przechodzimy do katalogu "easy-rsa", który znajduje się w miejscu instalacji OpenVPN. Uruchamiamy skrypt revoke-full.bat z parametrem określającym nazwę unieważnianego certyfikatu, np.:
          revoke-full.bat client1
      
revoke-full.bat - unieważnianie certyfikatów
Informacja o błędach w ostatnich wierszach oznacza, że weryfikacja unieważnionego certyfikatu nie powiodła się, czyli, że nie będzie można za jego pomocą zestawić tunelu VPN. W pliku index.txt można zauważyć, że przy użytkowniku client1 jest teraz znacznik "R" (ang. Revoked).
Utworzony plik crl.pem zawierający listę certyfikatów unieważnionych, należy przenieść do katalogu z konfiguracją programu OpenVPN. W pliku konfiguracyjnym na serwerze należy dodać poniższą opcję:
          crl-verify crl.pem              # nazwa pliku z listą unieważnionych certyfikatów
      
Dodatkowe uwagi
Jak już wcześniej było wspominane - częstym problemem podczas wystawiania certyfikatów i kluczy jest brak odpowiednich uprawnień umożliwiających zapis do katalogu instalacyjnego. Zmianę uprawnień można dokonać we właściwościach katalogu, w którym jest zainstalowany OpenVPN (domyślna ścieżka c:\Program Files\OpenVPN) w zakładce "zabezpieczenia".
Jedną z najważniejszych czynności jest regularne robienie kopii zapasowej katalogu "keys" znajdującego się na komputerze, który pełni funkcję CA. Jeżeli nie będziemy o tym pamiętać, w przypadku np. awarii dysku nie będzie można wystawiać i unieważniać certyfikatów.
Jeżeli mimo prawidłowej konfiguracji nie można połączyć się z serwerem, konieczne może być odblokowanie w zaporze systemowej portu wykorzystywanego dla potrzeb VPN. Możliwe również, że mimo zestawienia tunelu, podczas np. testowania połączenie za pomocą polecenia "ping" pojawi się komunikat "upłynął limit czasu żądania" oraz "100% straty" - w takim przypadku należy dodać w zaporze Windows regułę zezwalającą na odpowiedź na "ICMP Echo Request" (żądanie echa), np. z poziomu konsoli cmd można wykonać poniższe polecenie.
          netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=allow
      
Skrypty wykorzystywane w OpenVPN do prawidłowego działania wymagają zmiennych, które znajdują się w pliku vars.bat. Dlatego zawsze po otwarciu okna konsoli cmd należy go wywołać przed rozpoczęciem pracy z pozostałymi skryptami.
Klasa adresowa z której będą przydzielane adresy IP, musi być unikalna, to znaczy, że podsieć nie może pokrywać się z tą, do której aktualnie przynależymy. Wynika to wprost z działania samego protokołu IP. Serwer oraz podłączeni do niego klienci nie mogą mieć na dwóch interfejsach pokrywających się klas IP, inaczej wystąpi konflikt przy routowaniu pakietów. Dlatego dla potrzeb tunelu VPN powinno wybrać się dość nietypową klasę, aby zminimalizować ryzyko jej pokrycia z adresem IP, który otrzyma użytkownik, wpinając swój komputer do sieci np. w domu, hotelu, czy kawiarence internetowej.
W przedstawionych przykładach konfiguracji OpenVPN wykorzystano prywatną klasę adresową (parametr "local" dla pliku server.ovpn oraz parametr "remote" dla pliku client.ovpn), ponieważ środowisko testowe zostało uruchomione w sieci lokalnej. W przypadku środowiska produkcyjnego OpenVPN raczej nie będzie wykorzystywany do zestawienia połączenia klienta z serwerem, który znajduję w tej samej sieci lokalnej. Oznacza to, że jeżeli chcemy zestawić tunel VPN wykorzystując połączenie Internetowe, serwer musi być widoczny pod publicznym adresem IP. Więcej o adresach IP można przeczytać na stronie adresacja IP - publiczne i prywatne adresy IPv4.
W przypadku, gdy serwer łączy się z Internetem wykorzystując połączenie 3G/LTE (oferowane głównie przez operatorów komórkowych), zestawienie tunelu VPN może okazać się niemożliwe mimo przydzielenia publicznego adresu IP. Jest to spowodowane tym, że ruch przychodzący jest najczęściej blokowany. Rozwiązaniem jest wykupienie publicznego APN (ang. Access Point Name) u operatora.
Jeżeli serwer VPN stoi za NATem, konieczne jest przekierowanie odpowiedniego portu (w wykorzystanych przykładach plików konfiguracyjnych jest to port 1194 UDP) w ustawieniach routera, tak aby cały ruch był przekierowany na odpowiedni adres IP (serwer VPN) w naszej sieci lokalnej. Przykłady przekierowania portów dla różnych modeli routerów można znaleźć na stronie www.portforward.com.
Jeżeli chcemy udostępnić klientom dostęp np. do sieci wewnętrznej w firmie (znajdującej się oczywiście w innej klasie adresowej niż przydzielona dla naszego wirtualnego tunelu VPN), należy zmodyfikować ich tablicę routingu. OpenVPN umożliwia przekazywanie klientom odpowiednich ustawień, umieszczając w pliku konfiguracyjnym serwera lub w plikach specyficznych ustawień dla klientów poniższej opcji.
          route 192.168.10.0 255.255.255.0   # dodanie do tablicy routingu wpisu umożliwiającego
                                             # komunikację z inną siecią   
      
Jeżeli Serwer, na którym działa OpenVPN posiada zmienny adres IP, można skorzystać z serwisów i oprogramowania, które umożliwiają przypisanie do aktualnie używanego adresu IP stałej, niezmiennej nazwy. Aktywny program kliencki pilnuje, żeby tej nazwie odpowiadał zawsze aktualny adres IP. Usługę taką oferują m.in. www.dyn.com, www.no-ip.com, www.duckdns.org, www.no-ip.pl.
wstecz