Poradniki > Jak postawić i skonfigurować VPN z OpenVPN na Ubuntu 18.04

Jak postawić i skonfigurować VPN z OpenVPN na Ubuntu 18.04

Opublikowany: 20 stycznia 2020

Security Ubuntu VPN

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:

EasyRSA Variables

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
  • serwer: nazwa maszyny. Dla uproszczenia pozostaw "server", aby uniknąć wykonywania dodatkowych zmian

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
  • Wciśnij Enter żeby zaakceptować zaproponowaną standardową nazwę.

cp pki/private/client1.key ~/client-configs/keys/

  • Przekopiuj klucz klienta do wcześniej utworzonego folderu

scp pki/reqs/client1.req user@your_CA_IP:/tmp

  • Prześlij plik client1.req na maszynę CA

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
  • Znajdź sekcję "net.ipv4.ip_forward" i usuń "#" w celu odkomentowania instrukcji

Zmień reguły firewall w celu poprawnego kierowania połączeń klienta.

ip route | grep default
  • Wprowadź nazwę po "dev" ("eth0" w przykładzie poniżej)

Network Interface

sudo nano /etc/ufw/before.rules

Dodaj komendy jak na obrazku poniżej, zmieniając "eth0" na nazwę swojego interfejsu sieciowego.

OpenVPN Rules

# 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
  • Zmień wartość parametru "DEFAULT_FORWARD_POLICY" na "ACCEPT"

  • Dodaj port 1194 do ruchu UDP

sudo ufw allow 1194/udp $ sudo ufw allow OpenSSH
  • Zrestartuj firewall

sudo ufw disable

sudo ufw enable
  • Uruchom usługę VPN

sudo systemctl start openvpn
  • Sprawdź status usługi VPN.

sudo systemctl status openvpn

OpenVPN Service Status

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"

  • IP_Server: Wprowadź adres IP Serwera

  • 1194: wcześniej wybrany port

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
  • client1: nazwa klienta, którego uprawnienia zostały cofnięte

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.