VPN jest wirtualną siecią prywatną, która pozwala na dostęp do Internetu oraz poszczególnych serwisów nawet z niezaufanej sieci. W praktyce wygląda to tak, jakbyś był fizycznie podłączony do sieci prywatnej: możesz na przykład uzyskać dostęp do swojego konta bankowego i wykonywać transakcje bez obawy, że ktoś może przejąć ruch wygenerowany na Twoim urządzeniu.
OpenVPN to VPN bazujący na protokołach TLS (Transport Layer Security) oraz SSL (Secure Sockets Layer). OpenVPN wykorzystuje niektóre certyfikaty w celu szyfrowania ruchu pomiędzy serwerem i klientem końcowym.
W niniejszym poradniku przedstawimy instrukcję konfiguracji OpenVPN na serwerze Ubuntu 18.04.
W celu wykonania operacji przedstawionych w poradniku niezbędne będą dwie maszyny, z których jedna będzie pełniła rolę CA (Certification Authority) i sprawdzała poprawność certyfikatów.
Wymagane jest połączenie serwera oraz CA za pomocą połączenia SSH. Jeśli jeszcze tego nie zrobiłeś, zapoznaj się z naszym poradnikiem na temat bezpiecznego połączenia przez protokół SSH.
Instalacja OpenVPN
Połącz się z serwerem.
OpenVPN jest dostępny w oficjalnych instalacjach Ubuntu, więc nie ma potrzeby wgrywania dodatkowych plików.
Wprowadź:
sudo apt update
sudo apt install openvpn
Po wykonaniu operacji OpenVPN zostanie zainstalowany na serwerze.
Instalacja EasyRSA
Pobierz EasyRSA na swój serwer oraz CA poprzez wprowadzenie komendy na obu maszynach:
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
Najnowszą wersję można pobrać ze strony https://github.com/OpenVPN/easy-rsa/releases
cd ~
tar xvf EasyRSA-3.0.4.tgz
Nazwa może się różnić zależnie od pobranej wersji
Konfiguracja na serwerze
Zakończ konfigurację serwera za pomocą komend:
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz
sudo nano /etc/openvpn/server.conf
-
Znajdź sekcję odnoszącą się do HMAC ("tls-auth"). Jeśli linia jest zakomentowana, usuń ";".
-
Znajdź sekcję szyfrowania ("cipher"). Jeśli jest zakomentowana, usuń ";". Pod spodem dodaj nową linię zawierającą tekst "auth SHA256".
-
Znajdź sekcję "dh" definiującą parametry Diffie-Hellman i usuń "2048" z nazwy (powinieneś uzyskać "dh dh.pem").
-
Znajdź sekcje "user" oraz "group" i usuń ";" w celu odkomentowania linii.
Konfiguracja EasyRSA na CA
Zainstalowanie EasyRSA wiąże się z utworzeniem pliku konfiguracyjnego do definiowania zmiennych CA. Wprowadź:
cd ~/EasyRSA-3.0.4/
cp vars.example vars
nano vars
Usuń "#" dla instrukcji z obrazka poniżej:
Uruchom skrypt "easyrsa" w celu zainicjowania Public Key Infrastructure (PKI):
./easyrsa init-pki
./easyrsa build-ca nopass
za pomocą komendy zostaną utworzone dwa pliki:
-
ca.crt: publiczny certyfikat CA wykorzystywany przez serwery oraz klienty do wzajemnego przekazywania informacji o przynależności do zaufanej sieci.
-
ca.key: klucz prywatny wykorzystywany przez maszynę CA w celu podpisywania kluczy oraz certyfikatów dla serwerów i klientów. Ten plik musi znajdować się na maszynie CA (niedostępnej dla stron trzecich), gdyż w przeciwnym wypadku bezpieczeństwo sieci może zostać naruszone.
Zostaniesz poproszony o wprowadzenie nazwy. Pozostaw pole puste i wciśnij Enter.
Żądanie certyfikatu z CA
Po skonfigurowaniu maszyny CA, wygeneruj klucz prywatny oraz żądanie certyfikatu na serwerze i prześlij je na maszynę CA w celu podpisania:
cd ~/EasyRSA-3.0.4
./easyrsa init-pki
./easyrsa gen-req server nopass
Właśnie stworzyłeś klucz prywatny dla serwera i żądanie certyfikatu o nazwie "server.req":
sudo cp ~/EasyRSA-3.0.4/pki/private/server.key /etc/openvpn/
Skopiuj plik server.req na maszynę CA:
scp ~/EasyRSA-3.0.4/pki/reqs/server.req user@your_CA_ip:/tmp
Generowanie i podpisywanie certyfikatu
Zaimportuj przekopiowany plik do folderu EasyRSA na maszynie CA i podpisz go:
cd ~/EasyRSA-3.0.4/
./easyrsa import-req /tmp/server.req server
./easyrsa sign-req server server
Wprowadź “yes” i wciśnij Enter.
Przenieś podpisany certyfikat i ca.crt na Serwer VPN:
scp pki/issued/server.crt user@your_server_ip:/tmp
scp pki/ca.crt user@your_server_ip:/tmp
Następnie na Serwerze
przekopiuj otrzymane pliki do odpowiednich lokalizacji:
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/
cd ~/EasyRSA-3.0.4/
./easyrsa gen-dh
Wygeneruj silną wymianę klucza bazującą na Diffie-Hellman.
openvpn --genkey --secret ta.key
Przekopiuj wygenerowane pliki do folderu "/ etc / openvpn /"
sudo cp ~/EasyRSA-3.0.4/ta.key /etc/openvpn/
sudo cp ~/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/
Konfiguracja klienta
Stwórz folder do przechowywania certyfikatów i kluczy klienta (poradnik przedstawia tylko jeden klucz o nazwie ‘client1’, ale operacja musi zostać powtórzona dla każdego klienta, który korzysta z innej denominacji)
mkdir -p ~/client-configs/keys
chmod -R 700 ~/client-configs
cd ~/EasyRSA-3.0.4/
./easyrsa gen-req client1 nopass
cp pki/private/client1.key ~/client-configs/keys/
scp pki/reqs/client1.req user@your_CA_IP:/tmp
Zaimportuj żądanie certyfikatu na CA:
cd ~/EasyRSA-3.0.4/
./easyrsa import-req /tmp/client1.req client1
./easyrsa sign-req client client1
Wprowadź "yes" w celu autoryzacji podpisu.
scp pki/issued/client1.crt utente@IP_SERVER:/tmp
Przekopiuj następujące pliki do odpowiednich folderów na Serwerze.
cp /tmp/client1.crt ~/client-configs/keys/
cp ~/EasyRSA-3.0.4/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/
Teraz zarówno certyfikaty, jak i klucze serwera oraz klienta zostały wygenerowane.
Konfiguracja routingu IP oraz firewall
Zmień zasady przekazywania IP:
sudo nano /etc/sysctl.conf
Zmień reguły firewall w celu poprawnego kierowania połączeń klienta.
ip route | grep default
sudo nano /etc/ufw/before.rules
Dodaj komendy jak na obrazku poniżej, zmieniając "eth0" na nazwę swojego interfejsu sieciowego.
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
Zapisz i wyjdź.
sudo nano /etc/default/ufw
sudo ufw allow 1194/udp $ sudo ufw allow OpenSSH
sudo ufw disable
sudo ufw enable
sudo systemctl start openvpn
sudo systemctl status openvpn
Ustaw uruchomienie usługi przy włączeniu serwera
sudo systemctl enable openvpn
mkdir -p ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
nano ~/client-configs/base.conf
Znajdź sekcję "remote" i upewnij się, że przedstawia wartość "remote IP_Server 1194"
Znajdź sekcję "proto" i upewnij się, że serwer jest ustawiony na UDP (linia TCP powinna być zakomentowana przez ";")
Znajdź sekcje "user" oraz "group" i usuń ";", aby je odkomentować
Znajdź sekcje "ca.crt" - "client.crt" - "client.key" - "ta.key" i zakomentuj je dodając "#" na początku każdej linii
Znajdź sekcję "cipher" i dodaj linię "auth SHA256" pod "cipher AES-256-CBC"
Dodaj linię "key-direction 1" w dowolnym miejscu
Dodaj poniższe, zakomentowane linie w dowolnym miejscu. Jeśli klientem jest maszyna Linux, odkomentuj je
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
Zapisz i wyjdź.
Generowanie konfiguracji dla klientów
Na swoim serwerze stwórz skrypt do automatycznej kompilacji konfiguracji klienta.
nano ~/client-configs/make_config.sh
Skopiuj i wklej tekst:
#!/bin/bash
# First argument: Client identifier
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-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn
Zapisz i wyjdź
chmod 700 ~/client-configs/make_config.sh
Spróbuj wygenerować konfigurację klienta.
cd ~/client-configs
sudo ./make_config.sh client1
Zostanie utworzony plik “client1.ovpn”.
Przenieś plik na urządzenie, z którego chcesz korzystać. Będzie on wykorzystywany przez oprogramowanie VPN do ustanowienia połączenia.
Przekierowanie całego ruchu DNS przez VPN
Zmień wartość parametru: push "redirect-gateway def1 bypass-dhcp"
nano /etc/openvpn/server.conf
Znajdź sekcję „push” redirect-gateway def1 bypass-dhcp i usuń znak „;” by ją odkomentować
Cofnięcie certyfikatu Klienta
cd EasyRSA-3.0.4/
./easyrsa revoke client1
Wprowadź "yes", aby zatwierdzić.
Wygeneruj plik crl.pem i prześlij go na swój serwer:
./easyrsa gen-crl
scp ~/EasyRSA-3.0.4/pki/crl.pem user@IP_Server:/tmp
zaktualizuj konfigurację na serwerze, aby zweryfikować cofnięcie certyfikatu:
sudo cp /tmp/crl.pem /etc/openvpn
sudo nano /etc/openvpn/server.conf
Na końcu pliku dodaj "crl-verify crl.pem"
Zapisz i wyjdź.
sudo systemctl restart openvpn@server
Zrestartuj serwer w celu wprowadzenia zmian.