Virtual Private Network (VPN, ang. Virtual Private Network) to technologia umożliwiająca utworzenie tunelu, który jest odizolowany od sieci publicznej i pozwala wymieniać ruch między hostami utworzonej w ten sposób sieci prywatnej.  Z VPN wiąże się także podniesiony poziom bezpieczeństwa. Poniżej podamy przykład konfiguracji tunelu VPN na podstawie serwera OpenVPN.

Instalacja wymaganych pakietów

Generowanie kluczy i certyfikatów

Konfiguracja serwera OpenVPN

Konfiguracja klienta OpenVPN


Instalacja wymaganych pakietów

 

Na wstępie musimy się upewnić, że nasz system posiada zainstalowane wszystkie aktualizacje do wykorzystywanych pakietów. Aby wykonać aktualizacje wydajemy kolejno poniższe polecenia:

apt-get update
apt-get upgrade

Następnie weryfikujemy czy w systemie włączony jest TUN. Jest to sterownik dla wirtualnej karty sieciowej i jest konieczny do prawidłowego funkcjonowania OpenVPN. Domyślnie na serwerze Rootbox TUN jest włączony. Aby zweryfikować czy TUN jest włączony wydajemy polecenie:

test ! -c /dev/net/tun && echo TUN jest niedostepny || echo TUN jest dostepny

Jeśli w odpowiedzi pojawi się „TUN jest dostępny” możemy przejść do dalszych kroków. Teraz możemy wykonać instalacje pakietów OpenVPN oraz OpenSSL. Wydajemy polecenie:

apt-get install openvpn openssl

Generowanie kluczy i certyfikatów

 

Po zainstalowaniu OpenVPN i OpenSSL, przechodzimy do konfiguracji Easy-RSA, wykonujemy kolejno polecenia:

cp -prv /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
chown -R $USER /etc/openvpn/easy-rsa
cp vars{,.orig}

Następnie edytujemy plik, który posłuży do wygenerowania kluczy, wydajemy polecenie (w przykładzie użyto edytora vim):

vim ./vars

Na samym końcu pliku widnieją linie:

export KEY_SIZE=1024
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_EMAIL=mail@host.domain
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme

Są to parametry wykorzystywane przy tworzeniu certyfikatów. Wartość KEY_SIZE sugerujemy zmodyfikować z domyślnej wartości 1024 na 2048. Zmiana taka pozwoli na zwiększenie bezpieczeństwa certyfikatów. Kolejne wpisy edytujemy zgodnie z wymaganiami, np:

export KEY_SIZE=2048
export KEY_COUNTRY="PL"
export KEY_PROVINCE="Mazowieckie"
export KEY_CITY="Warszawa"
export KEY_ORG="Moja firma"
export KEY_EMAIL="kowalski@email.pl"
export KEY_EMAIL=kowalski@email.pl
export KEY_CN=Moje-CA
export KEY_NAME=Moje-CA
export KEY_OU=”Moja firma”

Zapisujemy plik i wykonujemy export:

source ./vars

W odpowiedzi powinien pojawić się komunikat:

root@vpn-10:/etc/openvpn/easy-rsa# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa/keys

Zgodnie z komunikatem, czyścimy utworzone wcześniej certyfikaty:

./clean-all

Teraz możemy przejść do generowania certyfikatu CA, wykorzystamy do tego celu skrypt build-ca. Wydajemy polecenie:

./build-ca

W efekcie powinniśmy otrzymać poniższy komunikat:

root@vpn-10:/etc/openvpn/easy-rsa# ./build-ca
Generating a 2048 bit RSA private key
....................................................................................................................................................................................+++
..............................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

Teraz pojawi się kilka pytań, które będą potrzebne do wygenerowania certyfikatu. Wszelkie dane podane zostały już w pliku ./vars, więc będzie konieczne tylko potwierdzenie każdej linijki klawiszem ENTER.

Country Name (2 letter code) [PL]:
State or Province Name (full name) [Mazowieckie]:
Locality Name (eg, city) [Warszawa]:
Organization Name (eg, company) [Moja firma]:
Organizational Unit Name (eg, section) [Moja firma]:
Common Name (eg, your name or your server's hostname) [Moje-CA]:
Name [Moje-CA]:
Email Address [kowalski@email.pl]:

Kolejnym krokiem będzie wygenerowanie certyfikatu serwera, wydajemy poniższe polecenie. Nazwa serwera podana w poniższym poleceniu (openvpn-server) jest przykładowa:

./build-key-server openvpn-server

W efekcie powinna pojawić się taka sama odpowiedź jak w poprzednim kroku, jednak będzie konieczne podanie także dodatkowych informacji:

Please enter the following 'extra' attributes
to be sent with your certificate request

Zgodnie z komunikatem podajemy hasło:

A challenge password []: MojeHaslo1!
An optional company name []: Moja firma

Po zatwierdzeniu powinien pojawić się komunikat z potwierdzeniem danych, które już wcześniej podawaliśmy oraz prośba o podpisanie certyfikatu. Zgadzamy się na podpisanie certyfikatu.

Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'PL'
stateOrProvinceName   :PRINTABLE:'Mazowieckie'
localityName          :PRINTABLE:'Warszawa'
organizationName      :PRINTABLE:'Moja firma'
organizationalUnitName:PRINTABLE:'Moja firma'
commonName            :PRINTABLE:'openvpn'
name                  :PRINTABLE:'Moje-CA'
emailAddress          :IA5STRING:'kowalski@email.pl'
Certificate is to be certified until Apr 12 08:04:36 2024 GMT (3650 days)

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

Pierwsze pytanie dotyczy podpisania certyfikatu, natomiast drugie jest ostatecznym potwierdzeniem. W odpowiedzi powinien pojawić się komunikat:

Write out database with 1 new entries
Data Base Updated

Następnie wygenerujemy certyfikat dla klienta. Nazwa openvpn-client1 jest przykładowa. Musimy także pamiętać, że dla każdego kolejnego klienta trzeba wygenerować nowy certyfikat. Jeśli tego nie zrobimy i spróbujemy połączyć więcej niż jednego klienta z tym samym certyfikatem, wszyscy klienci otrzymają ten sam adres IP i nastąpi konflikt lub połączenie w ogóle nie zostanie zestawione.

./build-key openvpn-client1

Proces wygląda identycznie jak w przypadku generowania certyfikatu serwera.

Kolejnym krokiem jest wygenerowanie certyfikatu PEM. Aby to wykonać wydajemy polecenie:

./build-dh

Generowanie certyfikatu może potrwać dłuższą chwile.

Opcjonalnie możemy wygenerować klucz HMAC w celu zabezpieczenia serwera OpenVPN przed potencjalnymi atakami DoS. Wydajemy polecenie:

openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key

Tak wygenerowane certyfikaty i klucze należy rozmieścić w odpowiednich lokalizacjach:

Na serwerze:

  • certyfikat CA
  • certyfikat serwera (w opisie openvpn-server.crt)
  • klucz do certyfikatu serwera (w opisie openvpn-server.key – klucz prywatny)
  • certyfikat PEM (w opisie dh2048.pem – jest to certyfikat publiczny)

Na kliencie:

  • certyfikat CA
  • certyfikat klienta (w opisie openvpn-client1.key
  • klucz do certyfikatu klienta (w opisie openvpn-client1.key – klucz prywatny)

Klucz HMAC (ta.key) musimy wkleić ręcznie w plikach konfiguracyjnych serwera i klienta.

Wszystkie certyfikaty i klucze są w lokalizacji /etc/openvpn/easy-rsa/keys/

Dla ułatwienia certyfikaty i klucz serwera kopiujemy do głównego katalogu OpenVPN:

cd /etc/openvpn/easy-rsa/keys/
cp ca.crt openvpn-server.crt openvpn-server.key dh2048.pem /etc/openvpn/

Natomiast poniższe certyfikaty i klucz przenosimy do klienta:

/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/openvpn-client1.crt
/etc/openvpn/easy-rsa/keys/openvpn-client1.key

Konfiguracja serwera OpenVPN

 

Możemy teraz przejść do właściwej konfiguracji OpenVPN. Zaczniemy od konfiguracji serwera.

W lokalizacji /etc/openvpn/ tworzymy plik konfiguracyjny server.conf w którym zapisujemy poniższą konfiguracje. Przy każdej linii umieszczony został opis parametru. Przed użyciem konfiguracji trzeba zmodyfikować wyróżnione pozycje zgodnie z wymaganiami: adres serwera, ścieżki do certyfikatów oraz klucz HMAC, który został wcześniej wygenerowany (ta.key). Klucz ta.key powinien być identyczny zarówno na serwerze jak i na wszystkich klientach.

dev tun                         # rodzaj interfejsu
local xxx                       # IP serwera (zamiast xxx podajemy adres IP serwera)
proto udp                       # uzywany protokol
port 1194                       # uzywany port
server 10.8.0.0 255.255.255.0   # klasa IP dla tunelu VPN
ca ca.crt                       # plik certyfikatu CA
cert openvpn-server.crt         # plik certyfikatu serwera
key openvpn-server.key          # plik klucza prywatnego serwera
dh dh2048.pem                   # plik z parametrami algorytmu Diffiego-Hellmana
max-clients 100                 # maksymalna ilosc klientow
persist-tun                     # podtrzymuje interfejs TUN w stanie UP podczas restartu
persist-key                     # zapamietuje klucz
keepalive 10 120                # utrzymuje polaczenie
cipher AES-256-CBC              # ustawienie algorytmu szyfrowania
comp-lzo                        # wlaczenie kompresji
verb 1                          # poziom logowania
user nobody			# uzytkownik na potrzeby OpenVPN
group nogroup			# grupa na potrzeby OpenVPN
push "redirect-gateway def1"    # przekierowanie calego ruchu przez VPN
push "dhcp-option DNS 8.8.8.8"  # konfiguracja DNS dla DHCP
push "dhcp-option DNS 8.8.4.4"  # konfiguracja DNS dla DHCP

log openvpn.log                 # pliki logów serwera OpenVPN
status openvpn-status.log

# Konfiguracja tls-auth         # klucz HMAC
key-direction 0
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OpenVPN Static key V1-----
</tls-auth>

Następnie konfigurujemy routing. Wydajemy w tym celu poniższe polecenia:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Aby zapisać reguły iptables wydajemy polecenie:

iptables-save > /etc/iptables.init

Aby reguły dodawały się automatycznie wraz ze startem serwera musimy dodać skrypt, który będzie je uruchamiał. W tym celu tworzymy plik /etc/network/if-pre-up.d/iptables z zawartością jak poniżej:

#!/bin/bash
test -e /etc/iptables.rules && iptables-restore -c /etc/iptables.rules

Ważne jest, aby dodać dla skryptu prawa do uruchamiania. Wydajemy w tym celu polecenie:

chmod +x /etc/network/if-pre-up.d/iptables

Serwer OpenVPN jest gotowy do pracy. Kolejną czynnością będzie skonfigurowanie klienta.

Konfiguracja klienta OpenVPN

 

Po instalacji klienta OpenVPN, konfiguracja sprowadza się do utworzenia pliku konfiguracyjnego, który dla każdego systemu będzie identyczny z wyjątkiem ścieżek do certyfikatów. Dla pewności ścieżki możemy podać w formie bezwzględnej lub zamieścić pliki certyfikatów w głównej lokalizacji klienta OpenVPN.

Aby zainstalować klienta OpenVPN:

w systemie Linux, wykonujemy polecenie:

apt-get install openvpn

w systemie Windows musimy pobrać zainstalować aplikacje OpenVPN GUI. W zależności od posiadanej wersji systemu (32 lub 64-bit) z poniższej strony pobieramy prawidłową wersję klienta:

https://openvpn.net/index.php/open-source/downloads.html

W przypadku systemu MacOS możemy skorzystać z darmowej aplikacji Tunnelblick. Jest ona rozprowadzana na licencji GPL:

http://code.google.com/p/tunnelblick/

Poniżej przykładowa działająca konfiguracja dla klienta OpenVPN. Przed użyciem konfiguracji trzeba zmodyfikować wyróżnione pozycje zgodnie z wymaganiami: adres serwera, ścieżki do certyfikatów, użytkownicy dla OpenVPN oraz klucz HMAC (ta.key):

dev tun                         # rodzaj interfejsu
client                          # tryb pracy
remote xxx                      # IP serwera (zamiast xxx podajemy adres IP serwera)
proto udp                       # uzywany protokol
port 1194                       # uzywany port
nobind                          # nie otwiera portu po stronie klienta
ca ca.crt      	     	        # plik certyfikatu CA        
cert openvpn-client1.crt	# plik certyfikatu klienta
key openvpn-client1.key		# plik klucza prywatnego klienta
persist-tun                     # podtrzymuje interfejs TUN w stanie UP podczas restartu
persist-key                     # zapamietuje klucz
keepalive 10 120                # utrzymuje polaczenie
cipher AES-256-CBC              # ustawienie algorytmu szyfrowania
comp-lzo                        # wlaczenie kompresji
verb 1                          # poziom logowania 
user nobody			# uzytkownik na potrzeby OpenVPN (tylko Linux)
group nogroup			# grupa na potrzeby OpenVPN (tylko Linux)

log openvpn.log			# pliki logow serwera OpenVPN
status openvpn-status.log

# Konfiguracja tls-auth
ns-cert-type server
key-direction 1
 
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END OpenVPN Static key V1-----
</tls-auth>

Konfiguracja klienta została zakończona.