Raspberry Pi jako serwer VPN
23.12.2015 | aktual.: 29.06.2017 12:29
Jako pierwszy wpis na moim blogu, proponuję aby z Raspberry Pi, z zainstalowanym systemem Raspbian (w moim przypadku z dystrybucją wheezy) stworzyć serwer VPN.
Wpis będzie bardzo, bardzo, bardzo długi, więc polecam zawczasu zrobić kawę, lub jej termos, i/lub upewnić się, że w trakcie tej świątecznej atmosfery, możecie znaleźć sobie przytulne, ustronne miejsce z dala od kuchni (z której oczywiście dobiega głos szanownej małżonki, że czeka Cię kolejna lista zadań do zrobienia). Za ilość słów (nie zawsze na temat) po prostu najmocniej przepraszam :)
Pomysł na serwer VPN wpadł jako tako sam, kiedy nie raz znalazłem się w sytuacji, kiedy będąc w biurze (lub w publicznym miejscu) nie mogłem odwiedzić niektórych stron internetowych, tylko dlatego, że usługodawca zablokował do nich dostęp. Posiadając działające Raspberry Pi lub inny mały podobny sprzęt, możemy stworzyć serwer VPN, do którego nasz laptop, telefon czy tablet będzie mógł się podłączyć i ruch internetowy będzie przekierowany poprzez łącze w domu (lub miejsca gdzie Raspberry jest podłączone do internetu). Zaletą tego systemu jest fakt, że sami jesteśmy administratorem takiego "serwera", oraz że nie musimy dodatkowo płacić za utrzymanie takiego serwera (chyba, że kupujemy Raspberry Pi tylko dla serwera VPN). Posiłkując się oficjalnym forum raspberry pi oraz różnymi portalami IT, zdobyłem wystarczającą umiejętność posługiwania się komendą kopiuj > wklej, aby system działa dla mnie bezproblemowo, 24 godziny na dobę, 7 dni w tygodniu. Ale od podstaw (lub od mniej więcej średnio amatorskiego poziomu)
Uruchamiamy SSH
Zaczynamy od uruchomienia Raspberry Pi i zalogowania się do niego poprzez terminal ssh. Osobiście, na windowsie używam małego programu o nazwie putty, natomiast z telefonu (Android) łączę się za pomocą VxConnectBot.
Jeśli Raspberry nie ma jeszcze uruchomionego dostępu poprzez ssh, możemy aktywować go poprzez panel konfiguracyjny raspberry.
Otwieramy terminal wybierając odpowiednią ikonę z menu lub ze skrótu na pulpicie:
Większość konfiguracji (można by rzec, że 99%) będziemy wykonywać właśnie z konsoli/terminala.
Komendy zatwierdzamy oczywiście enterem i obserwujemy jakie są wyniki na ekranie. Jeśli komenda została wykonana poprawnie a nie było żadnego odzewu po drugiej stronie, to w większości przypadków oznacza sukces.
Na start, aby zaktywować ssh:
[code=]sudo raspi-config[/code]
Z menu wybieramy opcję ósmą, czyli Advanced Options, po czym wybieramy SSH i Enable.
Po zakończeniu, wybieramy oczywiście opcję Finish.
Od tej pory, będąc w tej samej sieci, powinniśmy bezproblemowo móc podłączyć się do naszego Raspberry za pomocą takich programów jak putty. To ogólnie są podstawy malinki, więc nie sądzę, żeby tutaj nastąpiły jakieś problemy, jednak należy z pewnością zaznaczyć (w szczególności dla początkujących), że samo "aktywowanie" funkcji na Raspberry, nie zawsze będzie przynosić pożądane efekty, będąc poza domową siecią, jeśli np. nie ustawimy przekierowania portów.
A cóż to oznacza? Oznacza to, że jeśli będziemy poza domem i będziemy podłączeni do obcej sieci, to w momencie kiedy będziemy chcieli podłączyć się do Raspberry np. z hotelu, to nasz router nie będzie wiedział, do jakiego urządzenia wysłać żądanie.
Także ten tego... pomimo, że poradnik jest bardzo bardzo dokładny jeśli chodzi o nawet podstawowe rzeczy na Raspberry Pi, to jednak byłoby wręcz wskazane, żeby użytkownik wiedział co to jest adres IP i jak działa przekierowywanie portów. Poniżej niestety nie będzie nic na temat przekierowywania, chyba że ktoś bardzo będzie potrzebował (choć takich poradników na necie jest wręcz za dużo). (P.S. A przepraszam. Ważnym punktem jest, że aby połączyć się do serwer OpenVPN, nalezy przekierować port 1194 UDP do naszego Raspberry)
Wracając do głównego tematu.
Stały adres IP w sieci LAN
Jeśli uruchomiliśmy już SSH na naszej malince, to aby móc się do niej podłączyć przez np. putty, warto byłoby wiedzieć, pod jakim adresem IP nasze Raspberry jest dostępne i przy okazji ustawić IP na malince na stałe.
Aby poznać adres naszego Raspberry, w konsoli wpisujemy:
[code=]ifconfig[/code]
Jeśli Raspberry jest podłączone przewodem sieciowym, to zazwyczaj zgłosi się do nas na adapterze eth0:
Na moim przykładzie, Raspberry jest podłączone przewodem cat5e do routera i otrzymało adres 192.168.0.8. Maska sieci to 255.255.255.0, domyślną bramą jest pod 192.168.0.1, adres rozgłoszeniowy to 192.168.0.255 i siec jest pod adresem 192.168.0.0
Aby poznać potrzebne informacje do ustawienia adresu IP na stałe, wystarczy wpisać ifconfig oraz również komendą [code=]netstat –nr[/code] zapoznać się z naszą domyślną bramką.
Ok. Zapisujemy sobie gdzieś długopisem, ołówkiem czy na tablecie, smartfonie i innych nośnikach takie informacje jak: IP, Maska, Gateway (bramka) oraz bcast, destination i przechodzimy do zmiany pliku konfiguracyjnego od interfejsów sieciowych.
Wpisujemy w konsoli:
[code=]sudo nano /etc/network/interfaces[/code]
co w skrócie oznacza, że otwieramy edytor nano jako administrator a w nim plik interfaces
Odszukujemy iface eth0 inet dhcp i zmieniamy to na iface eth0 inet static po czym poniżej dodajemy informację o naszym wybranym adresie IP (oczywiście polecam zmienić tak, aby zgadzały się z Twoim ustawieniem sieci):
address 192.168.0.8
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
Z edytora nano wychodzimy wciskając klawisze CTRL+X, zatwierdzając że chcemy zapisać zmiany za pomocą "Y" i potwierdzając Enterem że nadpisujemy plik o tej samej nazwie.
W tym momencie ustawiliśmy adres IP na stałe na Raspberry Pi, ale nadmienię tutaj, że nie jest to 100% idealne rozwiązanie, aby ten adres był na zawsze przypisany do Raspberry Pi, bo tak naprawdę nie jest on w ogóle przypisany do tego urządzenia. Przypisanie adresu IP do urządzenia zazwyczaj odbywa się na routerze (w środowiskach biznesowych czasami na serwerze DHCP). Dlaczego? Otóż śpieszę z wyjaśnieniem. Jeśli np. nasz router ma ustawione, żeby przydzielać adresy IP w zakresie od 192.168.0.2 do 192.168.0.50 a czas ważności przydziału (rezerwacji adresu) jest ustawiony na tydzień, to może się zdarzyć (choć jest to mało prawdopodobne), że kiedyś odłączymy Raspberry Pi na jakiś czas, po czym jak je podepniemy z powrotem do tego samego routera, to Raspberry nie będzie w stanie komunikować się w danej sieci, bo ten sam adres jaki ustawiliśmy na Raspberry, został przyznany do innego urządzenia, które pojawiło się w sieci. Aby temu zapobiec, oczywiście używamy tabeli rezerwacji IP na routerze, ale to też będzie osobny temat (lub polecam po prostu pogooglować).
Statyczny adres IP z zewnętrznej sieci
Kolejnym punktem naszej wędrówki (aby ten nasz serwer VPN miał w miarę ręce i nogi), to kwestia statycznego zewnętrznego adresu IP. No bo jaki byłby sens, że wyjeżdżając na delegację służbową, siedzimy w Pendolino, korzystamy z Wifi, chcemy podłączyć się do Raspberry jako do naszego serwera VPN, ale nie znamy jego adresu IP. Jeśli mamy statyczny adres IP, to super ale w niektórych krajach jest prawie niemożliwe aby zdobyć takie udogodnienie jako prywatny (niebiznesowy) klient.
Z pomocą przychodzą nam oczywiście takie serwery DNS jak Dynamic-DDNS czy no‑ip.com, w których nawet zakładając darmowe konto, można uzyskać domenową nazwę, podpietą pod naszą sieć. Osobiście korzystam z no‑ip.com a ponieważ mój domowy router jest dosyć biedny (jeśli chodzi o jego konfigurację), to nie jestem w stanie niestety podpiąc konta z serwisu no‑ip do ustawień routera. Ale jak już mam Raspberry Pi, to czemu by nie dodać takiej funkcjonaliści jak już przy tym siedzimy ?
Zapewne niejeden z was by zaproponował, aby zakupić lepszy router w którym można "poustawiać więcej opcji", jednak nie jestem zwolennikiem wydawania pieniędzy na router, który za pół roku albo za rok może się okazać zupełnie niekompatybilny z infrastrukturą usługodawcy. Ponieważ mieszkam już kilka dobrych lat w UK, to nie raz zdarzało mi się, że na danym mieszkaniu nie było np. sensu podłączać linii ADSL, tylko mam po prostu światłowód, a natomiast przeprowadziłem się do domu, w którym w ogóle nie było żadnego dobrego internetu i trzeba było na początku męczyć się z modemem 3G, aby znowu trafić do innego miejsca, gdzie bez routera "od dostawcy" to nie było nawet jak wdzwonić się w ich sieć. Taki trochę dziki zachód, ale zazwyczaj to co dostajesz od dostawcy internetu, jest po prostu za darmo i ma działać.
Ale wracając do no‑ip i zakładania domeny (darmowej):
Najpierw zakładamy konto na stronie http://www.noip.com/ Link Znajomość podstawowego angielskiego jest wymagana, a login i hasło należy zachować na później. Po wybraniu opcji signup, wystarczy wybrać adres e‑mail, hasło i jaką nazwę chcielibyśmy użyć w internecie. Polecam zaznaczyć, że adres domeny wybierzemy później (bo jest po prostu większy wybór):
Aktywujemy konto, szukając maila z naszej skrzynce pocztowej (mailowej oczywiście), po czym przechodzimy do opcji "Create a hostname now"
Wpisujemy nazwę naszej domeny i wybieramy suffix:
Jak już założyliśmy konto i dodaliśmy nazwę domeny (którą niestety w wersji darmowej należy comiesięcznie odnawiać za pomocą kliknięcia w Captcha "I am not a robot" przy powiadomieniu drogą mailową), to możemy na Raspberry dodać skrypt, który periodycznie, będzie odświeżał serwer no‑ip.com z naszym obecnym adresem IP, przez co udając się pod właśnie tą nazwę domeny, będziemy przekierowywani na nasz adres IP.
Sprytne co nie?
Instalacja no-ip.com
Wracamy do Raspberry Pi, w konsoli/terminalu wpisujemy:
[code=]sudo apt‑get update && sudo apt‑get upgrade[/code]
Zatwierdzamy za pomocą "Y" jeśli cokolwiek jest do zaktualizowania i pobieramy noip:
[code=]wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz[/code]
Po pobraniu rozpakowujemy i usuwamy pobrane archiwum:
[code=]tar vzxf noip-duc-linux.tar.gz && rm noip-duc-linux.tar.gz[/code]
Za pomocą komendy ls -l możemy wylistować zawartość obecnego katalogu, skupiamy się aby odnaleźć ten nowo powstały dla no‑ip i przechodzimy do niego za pomocą komendy:
[code=]cd noip-2.1.9-1[/code]
(jeśli pobrała się nowsza wersja, zmieniamy oczywiście komendę adekwantnie do numeru wersji)
Tu mała podpowiedź. Jeśli chcemy łatwo wpisywać nazwy katalogów czy komend, wystarczy wpisać początek (pierwsze znaki) i nacisnąć przycisk TAB. Jeśli jest tylko jeden rezultat, terminal automatycznie uzupełni brakujące znaki, jeśli jest więcej wyników, należy nacisnąć TAB przynajmniej dwa razy, a wyświetlą się dostępne komendy/pliki/katalogi.
Aby przygotować pliki do instalacji, wpisujemy:
[code=]sudo make[/code]
Ignorujemy błędy, które się pojawiły (tacy z nas rebelianci) i przechodzimy do instalacji:
[code=]sudo make install[/code]
Podczas instalacji program zapyta nas o nasz login (mailowy) i hasło, oraz jak często powinien odświeżać serwer o naszym adresie IP. Co 15 minut myślę, że jest w sam raz:
Następnie uruchamiamy noip po raz pierwszy wpisując
[code=]sudo /usr/local/bin/noip2[/code]
Aby dodac noip do „autostartu” musimy stworzyć plik z konfiguracją. Wpisujemy w konsoli [code=]sudo nano /etc/init.d/noip[/code] i wklejamy skopiowaną konfiguracją (aby wkleić do terminala, wystarczy nacisnąć prawy przycisk myszy)
#! /bin/sh # /etc/init.d/noip ### BEGIN INIT INFO # Provides: noip # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Simple script to start a program at boot ### END INIT INFO # Carry out specific functions when asked to by the system case "$1" in start) echo "Starting noip" # run application you want to start /usr/local/bin/noip2 ;; stop) echo "Stopping noip" # kill application you want to stop killall noip2 ;; *) echo "Usage: /etc/init.d/noip {start|stop}" exit 1 ;; esac exit 0
Zamykamy edytor naciskając CTRL+X i potwierdzamy literą „Y” i Enter. Następnie musimy dodać uprawnienia do pliku:
[code=]sudo chmod 755 /etc/init.d/noip[/code]
oraz dodanie informacji do autostartu
[code=]sudo update-rc.d noip defaults[/code]
Jeśli mamy już załatwione trzy podstawowe sprawy (włączenie ssh, stałe IP w sieci LAN oraz adres domeny lub stały adres IP ze świata z zewnątrz) to możemy zabrać się za instalację serwera OpenVPN na Raspberry.
Instalacja OpenVPN
Ponieważ w poprzednich punktach instalowaliśmy już aktualizację, nie musimy tego wykonywać raz jeszcze, lecz jeśli jeszcze tego nie zrobiliśmy, to oczywiście w konsoli wpisujemy [code=]sudo apt‑get update[/code] oraz [code=]sudo apt‑get upgrade[/code]
Następnie instalujemy podstawę:
[code=]apt-get install openvpn easy-rsa[/code]
potwierdzamy, że chcemy wykorzystać całe 1,5MB przestrzeni na naszym Raspberry (jak już święta to rozpusta na całego co nie?)
Pierwszym krokiem będzie wygenerowanie klucza serwera. Ostrzegam, że czeka nas dosyć długa podróż przez nudne skrypty i komendy, więc jeśli już się znudziłeś, to zawróć póki możesz :)
Ty, który wchodzisz, żegnaj się z nadzieją...
Przejdźmy na uprawnienia administratora trochę bardziej permanentnie:
[code=]sudo -s[/code]
i skopiujmy cały katalog z /usr/ do folderu z openvpn
[code=]cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa[/code]
(proszę zwrócić uwagę na spację pomiędzy dwoma adresami. Ten po lewej to skąd kopiujemy, a ten po prawej to do którego kopiujemy) Następnie przechodzimy do katalogu:
[code=]cd /etc/openvpn/easy-rsa[/code]
Zmieńmy teraz plik konfiguracyjny aby wskazywał na nową lokalizację folderu z kluczami Edytujemy plik vars:
[code=]nano vars[/code]
W linii trzynastej lub pietnastej, zmieniamy linie export EASY_RSA na:
export EASY_RSA="/etc/openvpn/easy-rsa"
I tu taki przerywnik. Osobiście preferuję wpisywać większość (albo chociaż połowę) ręcznie, gdyż zdarza się, że jeśli autor użył innego kodowania znaków, to znaki specjalne nie będą poprawnie odczytywane przez nasze Raspberry Pi. Najczęściej spotykam się z sytuacją, że skopiowanie komendy typu sudo -s kończy się błędem, że użyłem niepoprawnego symbolu „‑„. lub też kopiowanie znaków jak apostrofy, cudzysłowia itp.
Jeśli zależy nam na lepszej metodzie szyfrowania kluczy, możemy odnaleźć linię export KEY_SIZE=1024 i zmienić to na 2048. Są tego plusy i minusy (np. podczas generowania bezpiecznego klucza, będziemy czekać o wiele wiele dłużej)
Jak już utworzyliśmy zmiany, to zapisujemy plik poprzez CTRL+X i potwierdzamy „Y” że chcemy zapisać zmiany. Ok. Czas zbudować certyfikat CA i root CA certyfikat. CA to Certifcate Authority – coś jak urząd który potwierdza, że klucz który posiadamy jest poprawny. Certyfikaty takie są spotykane w bankowości oraz stronach które używają bezpiecznego logowania (chyba nawet dobre programy taki posiadają :D ), ale w naszym przypadku, nasze Raspberry będzie wystawiać certyfikat sam sobie, aby wygenerować zatwierdzone klucze dla klientów sieci VPN. Jeśli znajdujemy się w katalogu /etc/openvpn/easy-rsa to wpisujemy komendy po kolei:
[code=]source ./vars[/code]
[code=]./clean-all[/code]
Spowoduje to ustawienie nowych zmiennych oraz wyczyszczenie wszystkich kluczy.
Teraz zbudujmy podstawowy certyfikat dla serwera:
[code=]./build-ca[/code]
Raspberry zapyta o wiele rzeczy, ale jedyne na co musimy odpowiadać to Common name i Name (czyli trzymajmy się zasady, że jeśli jest dopisek "changeme" to zmieniamy)
Przy pierwszym certyfikacie ustawiamy nazwę dla serwera. Ja w swoim przykładzie po prostu nazwę go Serwer.
Teraz zbudujmy klucz dla serwera, żeby sam serwer mógł łączyć się z samym sobą (tak mniej więcej). Oczywiście "Serwer" zmieniamy na :
[code=]./build-key-server Serwer[/code]
Na pytanie „Common name” odpowiadamy tak, jak nazwaliśmy serwer. Challenger password pozostawiamy puste Na sign the certificate odpowiadamy „y” że tak, chcemy podpisać certyfikat Na kolejne pytanie też odpowiadamy twierdząco
Na początek stwórzmy klucz dla jednego użytkownika (nazwę go Uzytkownik):
[code=]./build-key-pass Uzytkownik[/code]
Wpisujemy dwa razy haslo dla użytkownika (PEM pass phrase) oraz potwierdzamy nazwe użytkownika w polu „Name [changeme]” Challenge password pozostawiamy puste Sign in certificate – odpowiadamy tak, dwa razy
Jeśli chcemy dodać kolejnych użytkowników, po prostu robimy jeszcze raz ./build-key-pass [nazwa_nastepnego_uzytkownika]
Przechodzimy do folderu z kluczami:
[code=]cd keys[/code]
Teraz zabezpieczamy klucz algorytmem szyfrującym aby nie było go tak łatwo złamać:
[code=]openssl rsa -in Uzytkownik.key -des3 -out Uzytkownik.3des.key[/code]
Potwierdzamy trzy razy hasło ustawione dla użytkownika.
Operację powtarzamy dla każdego z użytkowników, oczywiście zmieniając nazwy plików .key i .3des.key
Wróćmy do katalogu /easy-rsa/ poprzez wpisanie:
[code=]cd ..[/code]
Czas dodać protokół panów Witfield Diffy i Martina Hellmana. Jest to (wg wikipedii) protokół uzgadniania kluczy szyfrujących. Nie chroni to przed atakami typu man in the middle ale pozwala bezpiecznie uzgodnić klucz (nawet jeśli ktoś podsłuchuje uzgadnianie).
Zanim jednak wprowadzimy komendę, ostrzegam, że w przypadku szyfrowania 1024-bitowego proces ten zajmuje coś około 5‑15 minut, natomiast przy 2048 bitach, na moim Raspberry zajęło to spokojnie kilka godzin.
I tu też mała ciekawostka... Putty i w ogóle terminal linuxowy ma to do siebie, że jeśli jesteśmy podłączeni zdalnie i wykonujemy jakąś operację w konsoli, to jeśli zerwiemy połączenie (lub zamkniemy okno), to cokolwiek robiliśmy - będzie przerwane. Nie chcę nawet mówić jak wkurzające to potrafi być, choć jednocześnie jest to w pewien sposób bezpieczne :) Jeśli chcemy wykonać teraz dodanie tego protokołu Diffy-Hellman, polecam doinstalować programik o nazwie "screen" który pozwoli nam utworzyć coś w rodzaju wirtualnej sesji wewnątrz terminala, która nie umrze jeśli zamkniemy połączenie.
Podpowiem tylko, że aby zainstalować screen, wystarczy wpisać w konsoli:
[code=]sudo apt‑get install screen[/code]
więcej informacji o "screen" pod tym adresem
także ten... jak już jesteśmy gotowi, to wpisujemy:
[code=]./build-dh[/code]
Czekamy, czekamy i czekamy.... jak już to się zakończy, to dodajemy zabezpieczenie HMAC aby nasza komunikacja była bardziej bezpieczna Więcej informacji o HMAC - wikipedia
[code=]openvpn -‑genkey -‑secret keys/ta.key[/code]
(proszę zwrócić uwagę na podwójne myślniki w kodzie)
Klucze i certyfikaty (plus podstawowe zabezpieczenia) zrobione. Teraz skonfigurujmy serwer OpenVPN aby wiedział których kluczy używać. Wpisujemy:
[code=]nano /etc/openvpn/server.conf[/code]
i wklejamy poniższy kod, który musimy zmodyfikować, aby pasował do adresu naszego Raspberry Pi:
local 192.168.0.8 # Wpisz adres IP Twojego Raspberry Pi dev tun proto udp #Niektórzy musza uzywac TCP, zmien jesli wiesz co robisz. port 1194 ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/Serwer.crt # zmien na nazwe klucza twojego serwera key /etc/openvpn/easy-rsa/keys/Serwer.key # zmien na nazwe klucza twojego serwera dh /etc/openvpn/easy-rsa/keys/dh1024.pem # jesli wybrales szyfrowanie 2048 bitowe, zmien tutaj! server 10.8.0.0 255.255.255.0 ifconfig 10.8.0.1 10.8.0.2 push "route 10.8.0.1 255.255.255.255" push "route 10.8.0.0 255.255.255.0" # Ponizej dane Twojej sieci push "route 192.168.0.8 255.255.255.0" # zmien z numerem IP i maski Twojego Raspberry # Dodaj adres DNS # jesli Twoj router nie robi za serwer DNS, mozesz, uzyc DNS Google 8.8.8.8 push "dhcp-option DNS 192.168.0.1" # Zazwyczaj bedzie to adres Twojego routera push "redirect-gateway def1" client-to-client duplicate-cn keepalive 10 120 tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0 cipher AES-128-CBC comp-lzo user nobody group nogroup persist-key persist-tun status /var/log/openvpn-status.log 20 log /var/log/openvpn.log verb 1
Ok.. serwer niby postawiony, ale wciąż mamy jeszcze sporo do zrobienia (sorry.. wiem że to długie i męczące).
Edytujemy konfigurację Rapsberry aby pozwolić na przekierowywanie ruchu:
[code=]nano /etc/sysctl.conf[/code]
Znajdź linię która mówi : „Uncomment the next line to enable packet forwarding for IPv4.” i usuń znak "#" sprzed tej linii, pozostawiając działającą linię (# przed czymkolwiek oznacza - to jest komentarz/notka, zignoruj, nie wykonuj tego)
Wyjdź z edytora nano zapisując zmiany.
Poinformuj Raspberry o zmianie komendą:
[code=]sysctl -p[/code]
Raspberry domyślnie ma wbudowany firewall, więc musimy dodać wyjątek do zapory.
Zbudujemy prosty skrypt:
[code=]nano /etc/firewall-openvpn-rules.sh[/code]
wpisujemy w środku:
#!/bin/sh iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.0.8
Oczywiście zmieniamy mój adres 192.168.0.8 na adres IP raspberry Pi Zapisujemy zmiany, wychodzimy z edytora, dodajemy uprawnienia wpisując:
[code=]chmod 700 /etc/firewall-openvpn-rules.sh[/code]
[code=]chown root /etc/firewall-openvpn-rules.sh[/code]
Pozostaje dodać jeszcze skrypt, aby zasady firewalla uruchamiały się dla naszego interfejsu sieciowego:
[code=]nano /etc/network/interfaces[/code]
Zaraz pod iface eth0 inet static dopisujemy
[code=]pre-up /etc/firewall-openvpn-rules.sh[/code]
Zapisujemy, wychodzimy z edytora. Uruchamiamy ponownie Raspberry:
[code=]sudo reboot[/code]
Po uruchomieniu ponownym przechodzimy znowu na uprawnienia admina:
[code=]sudo -s[/code]
Dodajemy wartości domyślne dla serwera.
[code=]nano /etc/openvpn/easy-rsa/keys/default.txt[/code]
Wklejamy poniższy kod, pamiętając aby edytować w linii czwartej adres zewnętrzny do naszego Raspberry Pi:
client dev tun proto udp remote twojpublicznyadres 1194 resolv-retry infinite nobind persist-key persist-tun mute-replay-warnings ns-cert-type server key-direction 1 cipher AES-128-CBC comp-lzo verb 1 mute 20
Zamykamy plik, zapisujemy zmiany, tworzymy kolejny skrypt dla OpenVPN:
[code=]nano /etc/openvpn/easy-rsa/keys/MakeOVPN.sh[/code]
#!/bin/bash # Default Variable Declarations DEFAULT="default.txt" FILEEXT=".ovpn" CRT=".crt" KEY=".3des.key" CA="ca.crt" TA="ta.key" #Ask for a Client name echo "Please enter an existing Client Name:" read NAME #1st Verify that client’s Public Key Exists if [ ! -f $NAME$CRT ]; then echo "[ERROR]: Client Public Key Certificate not found: $NAME$CRT" exit fi echo "Client’s cert found: $NAME$CR" #Then, verify that there is a private key for that client if [ ! -f $NAME$KEY ]; then echo "[ERROR]: Client 3des Private Key not found: $NAME$KEY" exit fi echo "Client’s Private Key found: $NAME$KEY" #Confirm the CA public key exists if [ ! -f $CA ]; then echo "[ERROR]: CA Public Key not found: $CA" exit fi echo "CA public Key found: $CA" #Confirm the tls-auth ta key file exists if [ ! -f $TA ]; then echo "[ERROR]: tls-auth Key not found: $TA" exit fi echo "tls-auth Private Key found: $TA" #Ready to make a new .opvn file - Start by populating with the default file cat $DEFAULT > $NAME$FILEEXT #Now, append the CA Public Cert echo "<ca>" >> $NAME$FILEEXT cat $CA >> $NAME$FILEEXT echo "</ca>" >> $NAME$FILEEXT #Next append the client Public Cert echo "<cert>" >> $NAME$FILEEXT cat $NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $NAME$FILEEXT echo "</cert>" >> $NAME$FILEEXT #Then, append the client Private Key echo "<key>" >> $NAME$FILEEXT cat $NAME$KEY >> $NAME$FILEEXT echo "</key>" >> $NAME$FILEEXT #Finally, append the TA Private Key echo "<tls-auth>" >> $NAME$FILEEXT cat $TA >> $NAME$FILEEXT echo "</tls-auth>" >> $NAME$FILEEXT echo "Done! $NAME$FILEEXT Successfully Created." #Script written by Eric Jodoin
Oczywiście plik zapisujemy, wychodzimy z edytora
Przechodzimy do folderu z kluczami:
[code=]cd /etc/openvpn/easy-rsa/keys/[/code]
Dodajemy uprawnienia do dopiero co stworzone pliku
[code=]chmod 700 MakeOVPN.sh[/code]
I uruchamiamy skrypt:
[code=]./MakeOVPN.sh[/code]
Wpisujemy nazwe użytkownika i zatwierdzamy enterem. O ile wpisaliśmy wszystko dobrze, zostanie to potwierdzone stosownym komunikatem.
Skrypt powyżej wygenerowal nam klucz ovpn którego użyjemy np. na laptopie. Serwer jest tak jakby ukończony. Aby zainstalować oprogramowanie na laptopie, potrzebne nam będzie kilka plików.
Będziemy potrzebować pliku ovpn z Raspberry. Polecam użyć oprogramowania jak WinSCP (do pobrania stąd) i po prostu podłączyć się do Raspberry na porcie 22 (SSH) którego i tak używamy dla sesji w terminalu.
Tu mała ciekawostka, próba przejścia do folderu /etc/openvpn/easy-rsa/keys powinna zakończyć się niepowodzeniem:
Powód jest dosyć prosty. Dla katalogu keys nie nadaliśmy uprawnienia dla użytkowników. Przechodzimy z powrotem do konsoli (ale tylko na chwilę) i tymczasowo dodajemy uprawnienia dla wszystkich:
[code=]sudo chmod 777 -R /etc/openvpn[/code]
Teraz możemy skopiować interesujący nas klucz.
Aby usunąć dostęp dla wszystkich (co jest dosyć ważne), a zostawić dostęp tylko dla użytkownika „pi” w konsoli wpisujemy:
[code=]sudo chmod 600 -R /etc/openvpn[/code]
Po rozłączeniu sesji w WinSCP i zalogowaniu się podobnie, powinniśmy mieć zablokowany dostęp do katalogu /etc/openvpn
Instalacja oprogramowania klienta na Windowsie
Teraz czas zainstalować oprogramowanie na laptopie (Win7) Na swoim laptopie używam aplikacji małej i bardzo wygodnej w użyciu którą jest: SecurePoint SSL VPN v2 Client (do pobrania stąd)
Po pobraniu i zainstalowaniu, otwieramy aplikację i z paska zadań otwieramy podręczne menu. Wybieramy małą konfiguracji (zębatka) i wybieramy "Import"
Importujemy plik .ovpn i klikamy na strzałki obok ikony użytkownika. Po wpisaniu hasła, jeśli wszystko poszło po naszej myśli - powinniśmy być podłączeni do Raspberry Pi jako klient jego sieci VPN.
Instalacja oprogramowania klienta na Androidzie
Mam nadzieję, że już dawno mamy plik ovpn dla naszego klienta/użytkownika. Jeśli nie - no to musimy jeden stworzyć i skopiować go do pamięci telefonu. Następnie pobieramy aplikację OpenVPN Connect ze sklepu GooglePlay (link tutaj)
Otwieramy aplikację na telefonie, wybieramy menu> Import, Import from SD Card
Wybieramy plik .ovpn
Po klinięciu na Connect, powinniśmy być podłączeni do serwera VPN
Tak prawdę mówiąc, na tym powinienem skończyć ten wpis, jednakże poniżej dodaję jeszcze informację, jak dodać użytkownik, kiedy już wszystko zakończyliśmy, a wystąpiła by potrzeba dodania kolejnego klienta.
Przykład na podstawie tworzenia klucza dla mojego telefonu: Po pierwsze, musimy przejść na uprawnienia roota w terminalu Raspberry Pi:
[code=]sudo -s[/code]
Następnie przechodzimy do katalogu easy-rsa:
[code=]cd /etc/openvpn/easy-rsa[/code]
Uaktualniamy konfigurację:
[code=]source ./vars[/code]
Po czym uruchamiamy
[code=]./build-key-pass Nexus[/code]
(jeśli wystapi blad skrypt nie potrafi odczytac ca.crt i ca.key, wtedy dodaj uprawnienia dla wszystkich chmod 777 dla /etc/openvpn/easy-rsa/ i jeszcze raz zrob source vars i buildkeypass)
Oczywiście podaj jakie hasło chcesz użyć dla następnego użytkownika, na pozostałe pytania nie musisz odpowiadać oprócz „Name [changeme]” gdzie warto podać nazwę użytkownika. Oczywiście potwierdź podpisanie certyfikatu.
Szyfrujemy nowego użytkownika poprzez przejście do folderu z kluczami:
[code=]cd keys[/code]
[code=]openssl rsa -in Nexus.key -des3 -out Nexus.3des.key[/code]
I uruchamiamy skrypt, który utworzy nam plik ovpn:
[code=]./MakeOVPN.sh[/code]
Oczywiście plik ovpn przenosimy na urządzenie, które będzie podłączać się jako nowy użytkownik do serwera VPN. Po zakończeniu dodawania użytkownika, polecam upewnić się, że tylko root ma dostęp do kluczy na naszym Raspberry
Wpis ten został oparty na podstawie:
http://readwrite.com/2014/04/10/raspberry-pi-vpn-tutorial-server-sec...
oraz
http://malinowepi.pl/post/43316048520/raspberry-pi-i-zmienne-ip-ddns
oraz
http://www.modmypi.com/blog/tutorial-how-to-give-your-raspberry-pi-a-s...
oraz własnej wiedzy :)
Teraz pytanie do was - czy widzi wam się taka seria czy też jest tego po prostu za dużo? Planuję coś napisać na temat serwera PXE (bootowanie po sieci) i Clonezilla, gdzie możemy trzymać kopie zapasowe naszego systemu (np. komputera z Windowsem) lub Raspberry Pi jako serwer torrentów.
Jeśli gdzieś wkradły się literówki, albo braki w polskich znaczkach, proszę o info. Niestety służbowe komputerki w pracy są tylko z językiem angielskim, a ja jakoś nie mogę się skłonić, aby co chwila przestawiać język w Wordzie, który na widok kodu i poleceń linuxowych, trochę gubi się w rozpoznawaniu języka :)
update: 28.12.2015 Wprowadziłem poprawkę w ustawianiu statycznego adresu IP. Zabrakło: inet przy interfejsie na eth0, przepraszam za brak Poprawiłem również niepoprawny screenshot przy potwierdzeniu wygenerowania klucza.
update: 19.12.2016 Poprawilem blad gdzie wspominalem zeby zmienic adres w linii czternastej na linie czwarta (poprawna)