Raspberry Pi – serwer VPN – cz. 2

W tym artykule zajmiemy się konfiguracją VPNu na naszym Raspberry Pi.
Do wyboru mamy kilka rozwiązań. Ja postawię na rozwiązanie otwarte, niezależne od platformy, sprawdzone, bezpieczne i zweryfikowane przez społeczność!

O czym mowa?

O OpenVPN. Jego konfiguracja nie jest niestety trywialna i potrzebna dobrego tutorialu, po drodze może pojawić się wiele problemów. Pokażę Wam jak ja to zrobiłem. Podczas przygotowań opierałem się na bardzo dobrym opracowaniu Jonaha.

Startujemy:

Opracowanie powinno zadziałać na każdej dystrybucji Linuxa opartej na jądrze Debiana.

Najpierw zmieńmy swoje domyślne hasło (jeśli jeszcze tego nie zrobiliśmy); domyślne hasło istotnie obniża nasze bezpieczeństwo (nadal trudno będzie włamać się z zewnątrz na nasza Mailnę, jednak teoretycznie – zadanie będzie łatwiejsze):

sudo passwd

Standardowo – aktualizujemy pakiety:

sudo apt-get update
sudo apt-get upgrade

Instalujemy OpenVpn:

sudo apt-get install openvpn

Aby nieco ułatwić sobie dalszą pracę uruchamiamy SSH jako root, tylko SuperUżytkownik może operować na kluczach szyfrujących połączenie:

sudo -s

Instalujemy GITa, z którego pobierzemy podstawią konfigurację:

sudo apt-get install git

Pobieramy podstawową konfigurację OpenVPNa wraz z narzędziem do generowania kluczy: EasyRSA, wydajemy polecenie:

git clone https://github.com/OpenVPN/easy-rsa.git

Pobieramy odpowiednią (najlepiej najnowszą wersję EasyRSA):

cd easy-rsa  
git checkout 2.2.2

Kopiujemy pobraną z GITa konfigurację do folderu OpenVPNa:

cp -r easy-rsa/2.0/ /etc/openvpn/easy-rsa

Tworzymy certyfikaty

Pobraliśmy EasyRsa – możemy teraz wygenerować certyfikaty wykorzystywane do zabezpieczania naszego połączenia do VPN.

Przejdźmy do folderu z pobranym EasyRSA:

cd /etc/openvpn/easy-rsa

EasyRSA konfigurację przechowuje w pliku vars, edytujmy go za pomocą prostego i przyjaznego edytora konsolowego nano (jeśli ktoś chce można również użyć vi czy gedit’a).

nano vars

Zmodyfikujmy w tym pliku linie zawierającą:

export EASY_RSA=”pwd”

I zastąpmy ten wpis następującym:

export EASY_RSA=”/etc/openvpn/easy-rsa”

Jeśli jesteśmy fanatykami bezpieczeństwa możemy również wydłużyć klucz szyfrujący z 1024B do 2054B, poprzez modyfikację wartości:

export KEY_SIZE

Zaczynamy tworzenie certyfikatów

Korzystamy z programów umieszczonych w folderze EasyRSA: /etc/openvpn/easy-rsa:

source ./vars  
./clean-all
./build-ca

Podczas generowania certyfikatu zostaniemy poproszeni o podanie kilku informacji – to metadane certyfikatu, nie mają dla nas istotnego znaczenia, niemniej można poświecić chwilę i je uzupełnić.

W końcu tworzymy certyfikat naszego serwera:

./build-key-server DOWOLNA_NAZWA_SERWERA

Znów zostaniemy poproszeni o wprowadzenie kilku informacji.

UWAGA:

Tym razem musimy zwrócić uwagę na informacje Common Name – powinniśmy tam wpisać nazwę naszego serwera (czyli to samo co wpisaliśmy jako DOWOLNA_NAZWA SERWERA powyżej).

Pole „A challenge password” musimy pozostawić puste.

Na ostatnie dwa pytani (o podpisanie i dołączenie certyfikatu) odpowiadamy twierdząco (y).

Generujemy klucze użytkowników

Klucze to pliki, którymi użytkownik będzie uwierzytelniał się na serwerze, klucz służy również do szyfrowania połączenia dzięki czemu mamy pewność co do jego poufności. Wprowadzamy również kolejną warstwę zabezpieczającą: oprócz znajomości loginu i hasła – musimy posiadać plik certyfikatu.
A więc przechwycenie (np. poprzez podejrzenie) naszego hasła nie oznacza możliwości włamania na nasz serwer VPN – atakujący musiałby jeszcze posiadać nasz klucz.

./build-key-pass DOWOLNA_NAZWA_UZYTKOWNIKA

Również odpowiadamy na zadawane przez kreator pytania i pozostawiamy parametr „A challenge password” puste.

UWAGA:

W polu: „Enter PEM pass phrase” wpisujemy hasło do naszego certyfikatu, koniecznie należy zapamiętać hasło, bez niego certyfikat będzie bezużyteczny!

Teraz musimy uszykować klucze do szyfrowania 3des:

cd keys  
openssl rsa -in User1.key -des3 -out User1.3des.key

Znów uruchamia się kreator, ważne aby podać hasło jak w poprzednim kroku!

Budujemy klucze Diffiego-Hellmana umożliwiające wymianę kluczy pomiędzy serwerem a klientem:

./build-dh

Trwa to trochę, na Raspberry Pi 2 ver B – około 8-10 min.

Możemy uruchomić zabezpieczenie przeciw atakom DDos poprzez:

openvpn --genkey --secret keys/ta.key

Co teraz?

Jak na razie mamy wygenerowane klucze; teraz konfigurujemy OpenVPN. 🙂

Edytujemy główny plik konfiguracyjny:

nano /etc/openvpn/server.conf

Skorzystamy z gotowego pliku konfiguracyjnego, wystarczy skopiować i wkleić poniższy tekst:

local IP_NASZEGO_RASPBERRY
dev tun 
proto udp 
port 1194 
ca /etc/openvpn/easy-rsa/keys/ca.crt 
cert /etc/openvpn/easy-rsa/keys/NAZWA_NASZEGO_CERTYFIKATU.crt # SWAP WITH YOUR CRT NAME
key /etc/openvpn/easy-rsa/keys/NAZWA_NASZEGO_CERTYFIKATU.key # SWAP WITH YOUR KEY NAME
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
server 10.8.0.0 255.255.255.0 
# server and remote endpoints 
ifconfig 10.8.0.1 10.8.0.2 
# Add route to Client routing table for the OpenVPN Server 
push "route 10.8.0.1 255.255.255.255" 
# Add route to Client routing table for the OpenVPN Subnet 
push "route 10.8.0.0 255.255.255.0" 
# your local subnet 
push "route IP_TWOJEGO_RASPBERRY 255.255.255.0" # SWAP THE IP NUMBER WITH YOUR RASPBERRY PI IP ADDRESS
# Set primary domain name server address to the SOHO Router 
# If your router does not do DNS, you can use Google DNS 8.8.8.8 
push "dhcp-option DNS 192.168.1.1" # This should match your router's IP address.
# Override the Client default gateway by using 0.0.0.0/1 and 
# 128.0.0.0/1 rather than 0.0.0.0/0. This has the benefit of 
# overriding but not wiping out the original default gateway. 
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
<code>mode server
tls-server</code>

Gdy połączymy się z VPNem nasza Mailna znajdzie się w dwóch sieciach (fizycznej i wirtualnej), musimy włączyć forwardowanie pakietów pomiędzy sieciami:

nano /etc/sysctl.conf

Usuwamy komentarz w linii:

#net.ipv4.ip_forward=1

Wprowadzamy zmianę:

sysctl -p

Na końcu stworzymy regułę POSTROUTING w naszym IPtables.

Przechodzimy do folderu pre-up /etc i wpisujemy:

nano firewall-openvpn-rules.sh

Dodajemy w pliku następująca zawartość:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source NASZ_LOKALNY_IP_NA_RASPBERRY

Nadajemy plikowi uprawnienia do wykonania i zmieniamy właściciela:

chmod 700 firewall-openvpn-rules.sh  
chown root firewall-openvpn-rules.sh

Dodajemy do firewalla regułę akceptująca przychodzące pakiety na port OpenVpn:

sudo iptables -A INPUT -p tcp --dport 1194 -j ACCEPT

Restartujemy nasz sprzęt:

sudo reboot

Sprawdzamy log – jeśli jest pusty, lub nie ma w nim niczego alarmującego znaczy, że się udało:

sudo cat /var/log/openvpn.log

Możemy dodatkowo sprawdzić czy serwer nasłuchuje na porcie 1194:

sudo netstat -a | grep "1194"

Za pomocą tej strony warto sprawdzić czy na naszym serwerze jest otwarty i prawidłowo przekierowany port 1194 oraz czy jest widziany w publicznej sieci.
Jeśli chcemy łączyć się z dowolnego miejsca na świecie – port musi być dostępny publicznie.


UWAGA:

W przypadku problemu i komunikatu w logu „OpenVPN – Socket bind failed on local address [AF_INET] IP:1194: Cannot assign requested address” należy zacementować linię:

local IP_NASZEGO_RASPBERRY

w pliku

/etc/openvpn/server.conf

 


Co później?

Pozostało:

  • Przekierowanie na routerze portu 1194 na adres Maliny.
  • Skonfigurowanie klienta.

O konfigurowaniu klienta będzie kolejny artykuł. Dzięki pewnej sztuczce jest to dużo łatwiejsze niż konfigurowania serwera. Zapraszam do śledzenia bloga.

W razie problemów dajcie znać w komentarzach!
Powodzenia! 🙂


Artykuł w ukazuje się w ramach projektu CyberHome tworzonego w ramach akcji DajSięPoznać.


Jedno przemyślenie nt. „Raspberry Pi – serwer VPN – cz. 2

  1. Witam, wydaje mi się, że ten poradnik jest najlepszy na jaki trafiłem w internecie, ale próbuje postawić 3 raz tego VPN i niestety mi nie wychodzi. A jest to część mojej pracy inżynierskiej. Więc bardzo prosiłbym o pomoc. Mam kilka pytań, gdyż dla mnie jako totalnego nowicjusza w LINUX nie wszystko jest zrozumiałe. Będę wdzięczny jeśli poświęci mi ktoś chwile i odpowie na moje pytania:

    „Pobieramy odpowiednią (najlepiej najnowszą wersję EasyRSA):
    cd easy-rsa
    git checkout 2.2.2
    Kopiujemy pobraną z GITa konfigurację do folderu OpenVPNa: ”

    komenda git checkout 2.2.2 – > rozumiem, ze tutaj jest wszystko ok? różne komunikaty mi wyskakiwały, ale poszedłem dalej, mysle ze jakoś to tam zaliczyło.

    Lecąc na sam dół w poleceniach mamy coś takiego:

    „Usuwamy komentarz w linii:
    #net.ipv4.ip_forward=1
    Wprowadzamy zmianę:
    sysctl -p ”
    jak usunę ten komentarz to rozumiem , ze zmiana „sysctl -p” wprowadzam po wyjściu i zapisaniu pliku. I dopiero normalnie tej ścieżce której się znajduję wpisuje tą komende ?

    tamte powyższe pytania: myślę, ze intuicyjnie zrobiłem tak jak powinno być (choć proszę o odpowiedź) ale tutaj kompletnie nie wiedziałem gdzie to wpisać, i nigdzie to nie wpisałem

    „Dodajemy do firewalla regułę akceptująca przychodzące pakiety na port OpenVpn:

    sudo iptables -A INPUT -p tcp –dport 1194 -j ACCEPT”
    gdzie to dodajemy? Firewalla, ale jaki to jest plik? Jaka jest ścieżka ? Nie wiem kompletnie gdzie to mam wpisać? Gdyż jak to wpisałem to po wpisaniu wcześniej tych komend z chowmod itp to pokazało mi ,że nie ma takiej biblioteki czy tam pliku 🙁

    Bardzo proszę o pomoc, gdyż na pewno za parę dni będę próbował znowu postawić server VPN z Pana poleceniami, bo widzę, że jestem blisko, ale niestety mi się to nie udaje.

    Koniec końców pokazuje mi taki komunikat gdy już sprawdzam mój VPN

    „Options error: unrecognized option or missing parameter(s) in /etc/openvpn/server.conf:29: mode (2.3.4)
    Usse --help for more information"

    BARDZO PROSZĘ O POMOC !

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *