Połączenia VPN są bardzo dobrym sposobem na zabezpieczenie połączenia z różnymi serwerami zdalnymi bądź z naszym miejscem pracy. Połączenie VPN możemy zakupić od jednego z wielu dostawców. Jeżeli jednak ważna jest dla nas kontrola nad serwerem do którego się łączymy, możemy stworzyć go sami, ważne jest jednak, aby posiadał stabilne połączenie, był wysoko dostępny oraz posiadał publiczny adres IP. Należy także pamiętać o tym, że w moim przykładzie, konfiguracja jest stworzona do moich potrzeb i może się różnić od innych. Dlatego podczas tworzenia serwera warto zapoznać się także z dokumentacją która znajduje się tutaj.

W moim przypadku, serwer na którym będzie działał OpenVPN będzie używał systemu Ubuntu 20.04. Przed przystąpieniem do instalacji należy jednak pamiętać o kilku ważnych krokach, których wykonanie pozwoli zaoszczędzić nasz czas i pozwoli na bezproblemową instalację.

Przed instalacją aktualizujemy system

sudo apt update
sudo apt upgrade

Oraz wyświetlamy i zapisujemy nasz publiczny adres IP

ip a show nazwa_interfejsu

W moim przypadku komenda wygląda tak

ip a show eth0

Teraz przechodzimy do etapu instalacji oraz konfiguracji. Razem z OpenVPN instalujemy Easy-RSA na potrzeby utworzenia kluczy kryptograficznych.

sudo apt install openvpn easy-rsa

Następnie jako zwykły użytkownik tworzymy katalog easy-rsa oraz tworzymy do niego łącze

mkdir ~/easy-rsa
ln -s /usr/share/easy-rsa/* ~/easy-rsa/

Później zmieniamy właściciela

sudo chown użytkownik ~/easy-rsa
chmod 700 ~/easy-rsa

W kolejnym kroku, zajmiemy się utworzeniem kluczy PKI. Aby tego dokonać przechodzimy do wcześniej utworzonego folderu i tworzymy nowy plik tekstowy.

cd ~/easy-rsa
nano vars

W nowo utworzonym pliku wpisujemy

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

Po zapisaniu uruchamiamy skrypt tworzący folder PKI

./easyrsa init-pki

Teraz czas na utworzenie żądania certyfikatu oraz utworzenie klucza prywatnego dla serwera

./easyrsa gen-req nazwa_serwera nopass

Komenda ta generuje żądanie certyfikatu dla serwera nazwa_serwera bez zabezpieczania go hasłem, jeżeli jednak chcemy je zabezpieczyć usuwamy parametr nopass. Teraz należy przenieść wygenerowany plik żądania do katalogu serwera OpenVPN

sudo cp /home/user/easy-rsa/pki/reqs/nazwa_serwera.req /etc/openvpn/server/

A następnie przenieść go na nasz serwer CA oraz podpisać

./easyrsa import-req /tmp/nazwa_serwera.req nazwa_serwera
./easyrsa sign-req nazwa_serwera nazwa_serwera

Po podpisaniu, przenosimy pliki z powrotem na nasz serwer, a następnie przenosimy je do katalogu OpenVPN

sudo cp /tmp/nazwa_serwera.crt /tmp/ca.crt /etc/openvpn/server

Dla dodatkowej warstwy ochrony naszej sieci dodamy klucz szyfrujący nasz ruch. Aby tego dokonać wchodzimy do folderu easy-rsa w katalogu domowym i generujemy klucz szyfrujący, który później przenosimy do katalogu serwera OpenVPN

cd ~/easy-rsa
openvpn --genkey --secret ta.key
sudo cp ta.key /etc/openvpn/server

Gdy zakończymy powyższe polecenia, możemy utworzyć pliki konfiguracyjne dla klientów. Najpierw tworzymy katalog dla plików konfiguracji i zmieniamy uprawnienia dostępu do niego.

mkdir -p ~/client-configs/keys
chmod -R 700 ~/client-configs

Teraz tworzymy żądanie wydania certyfikatu dla serwera urzędu certyfikacji i kopiujemy go do nowo utworzonego folderu

./easyrsa gen-req klient1 nopass
cp pki/private/klient1.key ~/client-configs/keys/

Następnie przenosimy żądanie wydania certyfikatu do serwera certyfikacji i tam go podpisujemy a następnie przenosimy go z powrotem na serwer vpn.

cd ~/easy-rsa
./easyrsa import-req /tmp/klient1.req klient1
./easyrsa sign-req client klient1

Teraz umieszczamy go w folderze z certyfikatami klienta, wraz z plikami klucza szyfrującego oraz certyfikatem serwera oraz zmieniamy prawa dostępu do tych plików.

cp /tmp/klient1.crt ~/client-configs/keys
cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
sudo chown user.user ~/client-configs/keys/*

Teraz, gdy mamy już wygenerowane certyfikaty możemy przystąpić do konfiguracji serwera. Kopiujemy przykładowy plik konfiguracyjny i rozpakowujemy go i otwieramy.

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/
sudo gunzip /etc/openvpn/server/server.conf.gz
sudo nano /etc/openvpn/server/server.conf

Dany plik konfiguracji jest po skopiowaniu gotowy do użytku, jednak możemy dostosować w nim rzeczy takie jak na przykład:
-port,
-protokół komunikacyjny,
-typ szyfrowania danych,
-i wiele innych.

Po dokonaniu zmian które chcemy wprowadzić, zapisujemy plik konfiguracyjny i zamykamy go.

Jeżeli w naszej konfiguracji nie ma błędów, powinniśmy bez problemu uruchomić serwer.

sudo systemctl -f enable openvpn-server@server.service
sudo systemctl start openvpn-server@server.service
sudo systemctl status openvpn-server@server.service

Jeżeli serwer wystartował, możemy zająć się tworzeniem plików konfiguracyjnych dla użytkowników. Najpierw tworzymy folder na certyfikaty i kopiujemy przykładowy plik konfiguracji na którego podstawie będą tworzone kolejne.

mkdir -p ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Po przekopiowaniu, otwieramy plik konfiguracyjny w edytorze i zmieniamy niektóre wartości tak, aby odpowiadały stanowi rzeczywistemu

remote adres_ip_serwera_vpn port_vpn_serwera
proto udp #pamiętać o tym żeby protokół był taki sam jak w konfiguracji serwera

Teraz możemy utworzyć skrypt ułatwiający nam tworzenie użytkowników. Tworzymy nowy plik i uruchamiamy go w edytorze tekstu

nano ~/client-configs/make_config.sh

A następnie kopiujemy do niego następującą zawartość

#!/bin/bash

KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-crypt>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-crypt>') \
    > ${OUTPUT_DIR}/${1}.ovpn

Dzięki takiemu skryptowi załączamy razem z plikiem wszelkie klucze oraz certyfikaty, dzięki czemu nie musimy wysyłać klientowi wielu plików, tylko jeden pakiet pozwalający na połączenie .

Aby zabezpieczyć skrypt przed niepowołanym dostępem, zmieniamy jego opcje zabezpieczeń

chmod 700 ~/client-configs/make_config.sh

Gdy mamy już całą konfigurację za sobą, możemy utworzyć nasz plik konfiguracyjny potrzebny do połączenia z siecią VPN.
Uruchamiamy skrypt tworzący konfigurację dla klientów.

cd ~/client-configs
./make_config.sh klient1

Teraz, nasz skrypt stworzy jeden plik konfiguracyjny z certyfikatami i ustawieniami połączenia i zapisze go w podfolderze ~/client-configs/files jako klient1.ovpn. Ten plik można teraz wydać klientowi i uruchomić.

Należy jednak pamiętać, że pomimo poprawnego działania serwera, warto przejrzeć opcje konfiguracyjne i dostosować je do warunków panujących w naszej sieci, czy do innych urządzeń, tak aby uzyskać jak największą wydajność. Szczegółowe informacje można znaleźć na stronie z dokumentacją techniczną.

Jeżeli masz jakieś dodatkowe pytania odnośnie konfiguracji, bądź jesteś zainteresowany zakupem serwera dla usługi OpenVPN zapraszamy do kontaktu przez formularz znajdujący się u dołu strony.