OpenVPN – to w pełni darmowe rozwiązanie, pozwalające tworzyć wirtualne sieci prywatne.
Aby poznać dłuższą definicję, zainteresowanych odsyłam na Wikipedię.
https://pl.wikipedia.org/wiki/OpenVPN
Właściwe co daje nam prywatny VPN?
Pozwala ukryć nasz prawdziwy adres IP
Nie oznacza to jednak, że połączenie będzie w pełni anonimowe. Będziemy dalej rozpoznawalni w sieci tylko pod innym adresem IP. Czasami jest to przydane, gdy na przykład będąc poza Polską chcemy korzystać z usług dostępnych tylko na terenie naszego kraju. Niestety zakładając własny serwer VPN na komercyjnym VPS (Virtual Private Server) nawet z polskim adresem IP, nie zadziałają takie usługi jak Netflix, Showmax czy NC+ Go. Ich algorytmy prawdopodobnie wykryją, że nasz adres IP nie jest tym od usługodawcy. Mogą zablokować dostęp, gdyż adres IP jest w bazie adresów przydzielonych do VPS.
Szyfruje ruch pomiędzy urządzeniem a serwerem VPN
W takim przypadku usługodawca internetowy nie będzie w stanie podsłuchać naszego ruchu. Wielu operatorów analizuje ruch sieciowy pod kątem przesyłanych treści. Dla usług typu VoIP lub streaming video ruch może być sztucznie spowolniony, tak, aby „zrobić miejsce” dla innych usług. Jest to wbrew zasadzie mówiące o neutralności sieci. W Polsce jednak nie ma żadnych regulacji prawnych zabraniających takich praktyk. Krótko mówiąc korzystając z prywatnego VPN można sprawić, że YouTube będzie dział szybciej.
Wymagania
- własny serwer z publicznym IP i systemem CentOS 7
- dostęp do root
- urządzenie klienckie typu telefon komórkowy z Androidem lub zwykły PC
Krok – 1 Aktualizacja systemu
Przed rozpoczęciem konfiguracji usługi OpenVPN niezbędnym jest aktualizacja systemu.
yum update -y
Po wykonanej aktualizacji uruchamiamy ponownie maszynę.
reboot
Krok 2 – Instalacja niezbędnych pakietów
OpenVPN nie jest dostępny w domyślnych repozytoriach systemu CentOS, wobec tego należy zainstalować go z dodatkowego repozytorium (Extra Packages for Enterprise Linux), które zawiera niestandardowe, niemniej popularne pakiety.
yum install epel-release -y
Po instalacji odświeżamy listę pakietów w systemie.
yum update -y
Następnie przechodzimy do instalacji niezbędnych do uruchomienia serwera VPN pakietów.
yum install -y openvpn wget nano
Pakiety wget oraz nano są opcjonalne, gdyż mogą być już dostępne w systemie.
wget – program służący do pobierania plików z Internetu za pośrednictwem protokołów HTTP
nano – prosty edytor tekstowy
Jeżeli instalator OpenVPN nie utworzył nowego folderu /etc/openvpn, należy stworzyć go samodzielnie. W tym folderze przechowywane będą pliki konfiguracyjne serwera VPN.
mkdir /etc/openvpn
Do tego folderu należy skopiować domyślny plik konfiguracyjny usługi.
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn
Następnie instalujemy „Easy RSA”. Jest to narzędzie służące do tworzenia i zarządzania certyfikatami dla potrzeb OpenVPN.
yum install easy-rsa -y
Narzędzie „Easy RSA” prawdopodobnie zainstaluje się w najnowszej – trzeciej wersji. Mimo to, z uwagi na liczną dokumentacje oraz wsparcie innych użytkowników dla starszych wersji, polecam instalację tego oprogramowania oznaczoną numerem 2.3.3.
Starszą wersje można pobrać w poniższy sposób:
wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz
Plik zostanie pobrany do katalogu tymczasowego, przechodzimy do niego.
cd /tmp
Należy wypakować pobrane archiwum.
tar xfz /tmp/easyrsa
Tworzymy nowy folder i kopiujemy do niego pliki z wypakowanego archiwum.
mkdir /etc/openvpn/easy-rsa
cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa
Krok 3 – Konfiguracja serwera
Przechodzimy do edycji domyślnego pliku konfiguracji serwera OpenVPN.
nano /etc/openvpn/server.conf
W pliku konfiguracyjnym należy zmienić treść kilku linijek, zwykle usuwając średnik z początku linii.
Pierwsza linijki, którą należy odszukać jest:
push "redirect-gateway def1 bypass-dhcp"
Oczywiście usuwamy średnik z początku wyrażenia. Dzięki temu ustawieniu klient przekieruje cały ruch przez serwer OpenVPN. Uwaga, jeżeli w systemie posiadamy już inne niestandardowe konfiguracje związane z siecią, włącznie tej funkcji może spowodować problemy z działaniem niektórych usług sieciowych, na przykład z SSH.
Łącząc się z serwerem VPN nie będziemy mogli korzystać z domyślnych serwerów DNS dostarczonych przez dostawcę usług internetowych (jego ruch zostanie przekierowany), musimy zatem wskazać, które serwery DNS będą wykorzystywane do połączenia się z OpenVPN. Można wskazać dowolne, najczęściej użytkownicy polecają serwery DNS od Google (8.8.8.8 oraz 8.8.4.4). Polecam skorzystanie z adresów OpenDNS (208.67.222.222 i 208.67.220.220)
OpenDNS dodatkowo oferuje adresy DNS 208.67.222.123 oraz 208.67.220.123, które blokują strony pornograficzne oraz złośliwe oprogramowanie. Pozytywnym efektem ubocznym w OpenDNS jest blokowanie niektórych reklam w serwisach VOD.
W pliku konfiguracyjnym szukamy dwóch wierszy zaczynających się od:
;push "dhcp-option DNS …"
Zamieniamy ich treść, wpisując wybrane przez nas adresy DNS.
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
Następnie zmieniamy ustawienia tak, aby usługa OpenVPN na naszym serwerze mogła być uruchomiona bez żadnych dodatkowych przywilejów, wobec to szukamy poniższych linijek, w których usuwamy średnik.
user nobody
group nobody
Opcjonalnie w pliku konfiguracyjnym można zmienić numer portu usługi. Jest to dodatkowe zabezpieczenie przed atakami na serwer VPN.
port 1194
1194 zamieniamy na przykład na 11194. Numer port musi być większy od 1024, aby serwer mógł działać bez uprawnień root.
Zapisujemy zmiany w pliki i zamykamy go.
Krok 4 – Generowanie kluczy i certyfikatów
Tworzymy katalog, w którym przechowywane będą klucze oraz certyfikaty.
mkdir /etc/openvpn/easy-rsa/keys
Edytujemy plik, w którym znajdują się informacje na temat wydawcy certyfikatów.
nano /etc/openvpn/easy-rsa/vars
Szukamy linijek (prawdopodobnie są na samym końcu pliku), zawierających słowo export
export KEY_COUNTRY="CA"
export KEY_PROVINCE="QC"
export KEY_CITY="Montreal"
export KEY_ORG="Globotech"
export KEY_EMAIL="abuse@example.com"
export KEY_OU="IT"
export KEY_NAME="hostname"
Zamieniamy hostname (lub inne) na server w wyrażeniu KEY_NAME
export KEY_NAME="server"
Pozostałe parametry można opcjonalnie zmienić, dostosowując je do naszych potrzeb.
export KEY_COUNTRY="PL"
export KEY_PROVINCE="Malopolskie"
export KEY_CITY="Krakow"
export KEY_ORG="VPN"
export KEY_EMAIL="vpn@nazwanaszejstrony.pl"
export KEY_OU="VPN"
export KEY_NAME="server"
Zapisujemy plik i zamykamy go.
Kopiujemy plik konfiguracyjny OpenSSL do innej ścieżki.
cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
Nadszedł czas na wygenerowanie kluczy i certyfikatów. Przechodzimy pod wskazany folder i wykonujemy poniższą komendę.
cd /etc/openvpn/easy-rsa
source ./vars
Uruchamiamy skrypt czyszczący wszystkie poprzednio wygenerowane certyfikaty dla serwera i klientów.
./clean-all
Tworzymy urząd certyfikacji. Podczas wykonywania skryptu zostaniemy zapytani o wcześniej wprowadzone wartości. Za każdym razem należy kliknąć klawisz ENTER.
./build-ca
Powyższy skrypt wygeneruje plik ca.key. Jest to tzw. klucz prywatny używany do podpisywania certyfikatów serwera i klientów. Jeżeli utracimy dostęp do tego pliku, nie będzie można wygenerować nowych certyfikatów. Jeśli dostęp do pliku otrzymają osoby niepowołane, to będą mogły połączyć się z serwerem VPN bez naszej wiedzy.
Zaleca się, aby plik przechowywać w dobrze zabezpieczonej lokalizacji. Nawet bez dostępu do sieci.
Następnie tworzymy certyfikat dla serwera. W tym przypadku również zostaniemy poproszeni o potwierdzenia danych certyfikatu. Za każdym razem należy kliknąć ENTER. Dodatkowo program zapyta o hasło i opcjonalną nazwę firmy. Oba pola można pozostawić puste. Gdy wpiszemy hasło, podczas łączenia klienta z serwerem VPN będzie trzeba je podać. Na samym końcu potwierdzamy stworzenie certyfikatu klikając Y.
./build-key-server server
Ostatnią częścią tworzenia kluczy dla serwera jest wygenerowanie pliku wymiany (kluczy Diffiego-Hellmana). Poniższa operacja może trwać kilka minut.
./build-dh
Wygenerowane klucze kopiujemy do głównego folderu konfiguracji OpenVPN
cd /etc/openvpn/easy-rsa/keys
cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
Każdy klient, który będzie łączył się z OpenVPN również potrzebuje klucza i certyfikatu, aby serwer mógł go uwierzytelnić. Przechodzimy do katalogu easy-rsa
cd /etc/openvpn/easy-rsa
Uruchamiamy program tworzący certyfikaty dla klienta. Słowo „client” to nazwa użytkownika, można je dowolnie zmienić. Jeżeli spodziewamy się wielu klientów – nazwę można określić jako nazwę hosta np. „pcdom” lub nazwę urządzenia np. „android”. Krok ten można wykonać wielokrotnie – w zależności od liczby spodziewanych klientów.
./build-key pcdom
./build-key android
Klucze i certyfikaty w postaci plików zostaną wygenerowane na serwerze. Należy je skopiować do urządzeń klienckich, wykonamy to w ostatnim kroku.
Krok 5 – Routing
Domyślnie CentOS korzysta z narzędzia o nazwie firewalld, które zapewnia dynamiczne zarządzanie zaporą sieciową. Ze względu na brak doświadczenia w pracy z tym narzędziem polecam skorzystanie z narzędzia iptables.
Instalujemy narzędzie iptables
yum install iptables-services -y
Po instalacji nowego programu wyłączamy usługę związaną z firewalld
systemctl mask firewalld
systemctl stop firewalld
Włączamy nową usługę.
systemctl enable iptables
systemctl start iptables
Dodatkowo profilaktycznie czyścimy konfigurację iptalbles
iptables –flush
Dodajemy nową regułę związaną z uruchomieniem serwisu OpenVPN
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables
Następnie edytujemy plik
nano /etc/sysctl.conf
w którym dodajemy linijkę, która odpowiada za przekazywanie adresów IP
net.ipv4.ip_forward = 1
Dodanie powyższej linijki spowoduje przekierowanie całego ruchu internetowego z klienta na adres IP serwera, a publiczny adres IP klienta zostanie skutecznie ukryty.
Krok 6 – Uruchomienie usług
W systemie CentOS włączamy i uruchamiamy usługę VPN.
systemctl -f enable openvpn@server.service
systemctl start openvpn@server.service
Aby sprawdzić status uruchomionej usługi należy wpisać
systemctl status openvpn@server.service
W przypadku poprawnie uruchomionej usługi, na ekranie powinniśmy zobaczyć między innymi fragment tekstu:
Active: active (running)
Jeżeli usługa nie została uruchomiona poprawnie, można sprawdzić czy plik konfiguracyjny jest na pewno prawidłowy.
openvpn --config /etc/openvpn/server.conf
Skrypt wskaże nam ewentualne błędy w pliku konfiguracyjnym usługi.
Krok 7 – Konfiguracja klienta i łączenie z serwerem OpenVPN
Niezależnie od systemu operacyjnego klienta, aby połączyć się z serwerem OpenVPN należy mieć dostęp do klucza oraz certyfikatów wygenerowanych dla danego klienta. Żądane pliki są w poniższej lokalizacji
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/pcdom.crt
/etc/openvpn/easy-rsa/keys/pcdom.key
/etc/openvpn/easy-rsa/keys/android.crt
/etc/openvpn/easy-rsa/keys/android.key
Aby połączyć się z serwerm OpenVPN, należy użyć oprogramowania klienckiego. W zależności od systemu operacyjnego
Dla systemu Windows program można pobrać ze strony:
Plik: openvpn-install-2.4.5-I601.exe (lub podobny)
Tworzymy plik pcdom.ovpn
client
dev tun
proto udp
remote ADRES_IP_SERWERA PORT_USŁUGI
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
<ca>
//Tutaj tak wklejamy zawartość pliku ca.crt
</ca>
<crt>
//Tutaj wklejamy zawartość pliku np. pcdom.crt
</crt>
<key>
//Tutaj wklejamy zawartość pliku np. pcdom.key
</key>
Podmieniamy adres IP serwera oraz numer portu usługi.
W znaczniki ca, cert oraz key, wklejamy odpowiednio zawartość plików ca.crt, pcdom.crt, pcdom.key
Dla systemu Android polecam aplikację „OpenVPN for Android”
https://play.google.com/store/apps/details?id=de.blinkt.openvpn
Informacje na temat liczby połączeń z serwerem VPN można sprawdzić przy pomocy:
cat /etc/openvpn/openvpn-status.log