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
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
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.
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.