Raspberyy Pi B+

OpenVPN Raspberry Pi – split-tunnel i dostęp do Internetu

Czy chciałbyś połączyć się z dowolnego miejsca, najczęściej z otwartej sieci WiFi w mieście, na lotnisku – ze swoją siecią domową ? Virtual Private Network (VPN) to rozwiązanie, które pozwala na zalogowanie się do domowej sieci lokalnej w sposób bezpieczny, ale także pozwala na dostęp do Internetu z naszej sieci lokalnej, co dodatkowo zabezpiecza nas przez problemami z dostępem w publicznych, nieszyfrowanych sieciach WiFi.

Raspberyy Pi B+
Raspberyy Pi B+

Co będzie potrzebne ?

Sprzęt:

  • Rapberry Pi (wersja A lub B, czy też B+ albo nawet wersja druga)
  • Domowy ruter, który obsługuje Port Forwarding albo Virtual Server czyli praktycznie dowolny

Oprogramowanie:

  • Raspbian – czyli standardowa dystrybucja dla Raspberry Pi
  • OpenVPN – darmowa wersja serwera dla dystrybucji Rasbian ze standardowego repozytorium
  • OpenVPN – klient – dla różnych systemów i urządzeń – Linux, Android, MS Windows etc.

Jak widać – nic wymagającego!

Bezpieczeństwo

Poświęćmy teraz chwilę na uzmysłowienie sobie co powinniśmy wiedzieć o zabezpieczeniu naszego rozwiązania:

  • dostęp do Raspberry Pi powinny mieć osoby wyłącznie zaufane (najlepiej tylko Ty)
  • dostęp do katalogów w /etc powinien być dla zdrowia – ograniczony do użytkownika z prawami jakiego uruchamiany jest OpenVPN na Raspberry Pi
  • Tajny i ważny jest plik z rozszerzeniem .key
  • Pliki z certyfikatami kończące się na .crt czy .crs – można rozsyłać emailem, gubić, odwoływać – generować wtedy na nowo etc.
  • każde łączące się urządzenie (komputer, smartfon) ma własną parę klucz/certyfikat

Do dzieła!

Logujemy się do naszego raspberry pi przez lokalną konsolę lub ssh i zwyczajowo upewniamy się że jest aktualne:

Teraz instalujemy OpenVPN:

Wszystkie komendy będziemy praktycznie wykonywać z prawami roota (Administratora), więc sugeruję globalnie wydać:

Następnie przystąpimy do skonfigurowania serwera, ale przede wszystkim – wygenerowania certyfikatów SSL, które pozwolą na zabiezpieczenie połączenia.
Konfigurację i cetryfikaty przechowujemy w /etc, stwórzmy więc zgodnie ze sztuką odpowiedni katalog i skopjujmy przykładowe pliki i skrypty do generacji certyfikatów, które w Raspbianie Wheezy znajdują się w:

W nowszym Jessie, jak zauważa w komentarzach Dom/OloX – katalog z przykładami znajduje się w /usr/share:

W przykładach do wygenerowania certyfikatu dostaniemy dane z USA. Zapytacie, co? Chodzi tutaj o to, że certyfikat musi mieć informacje o wystawiającym – dzięki czemu przeglądarki, które używają tego samego typu certyfikatów, mogą zaprezentować dane o wystawcy certyfikatu, oraz weryfikować kto go rzeczywiście podpisał. My podpiszem sobie oczywiście sami – w końcu to nasz certyfikat!

Edytujemy dla porządku plik (inaczej wszyscy będziemy z San Francisco…):

Zmiany w miejscach w pliku – dotyczą katalogu z eksportem kluczy, oraz długości klucza asymetrycznego – standardowo w wrześniu 2015 jest to 1024 – ale jeśli jest np: 2048 – to za dużo na mały procesorek Raspberry Pi. Upewniamy się więc, że mamy tam 1024:

Kod kraju PL, województwo np: WA i tak dalej – to jest opcjonalne – ale już KEY_CN – należałoby zmienić.
Teraz przygotujmy się do wygenerowania kluczy, uruchamiamy:

Czas na zbudowanie systemu certyfikującego, uruchamiamy:

W rezultacie, pozostanie odpowiedzieć – potwierdzić ENTER zapisy z pliku vars:

Do katalogu keys trafią pliki ca.key i ca.cert.

Teraz generujemy klucz naszego systemu, komenda:

Uwaga – teraz zostaniemy poproszeni o podanie hasła. STOP. Podajemy, ale później będziemy je podawać przy każdym połączeniu. Możemy usunąć to wymaganie i będzie to trochę ukłon w stronę ułatwienia a nie zabezpieczenia, ale… coś za coś!

Odpowiamy yes na pozostałe pytania i tym razem w katalogu keys pojawią się pliki : server.crt oraz server.key w (/etc/openvpn/easy-rsa/keys/), które to będą podpisane Twoim certyfikatem root.

Teraz budujemy parametry Diffie-Hellmann’a, wymagane do rozmowy pomiędzy serwerem a klientem. Cały proces wymiany jest bardzo ciekawy – polecam poczytać w wolnej chwili https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange

To da nam 1024.pem – zmieniamy nazwę na dh1024.pem
Pozostaje teraz zbudować pary dla konkretnego urządzenia:

…wraz z hasłem do połączenia:

To już prawie koniec generacji – na koniec wspólny klucz HMAC do TLS:

Nasze klucze proponuję skopiować do /etc/openvpn/mojeklucze/

Teraz skonfigurujemy serwer OpenVPN przy użyciu naszych nowych kluczy i certyfikatów.
Tworzymy plik /etc/openvpn/openvpn.conf z następującą zawartościa:

Jeśli popatrzymy na nasz plik, to widać, że będziemy prosić aby po połączeniu, cały ruch wychodzący od klienta do serwera, oczywiście z pominięciem tras statycznych na kliencie – był kierowany przez tunel. Dzięki temu zapewnimy także dostęp do Internetu a nie stracimy połączenia z lokalnymi usługami na kliencie. Jako serwery nazw – podajemy np: popularny rozwiązywacz nazw Google, a jako drugi – nasz domowy, lokalny. Ważna linia to server – który podaje sieć na jakiej zostanie stworzony tunel – wybierzmy coś czego nie używamy nigdzie indziej. Port to 1194 – trzeba będzie pamiętać aby dokonać przeniesienia na ten port usługi (port forwarding) na ruterze głównym (ok, najczęściej jedynym ruterze) w domu – ponieważ na ten port klient zapuka – zróbmy też wyjątek dla niego w ścianie ogniowej naszego rutera (często jest opcja do tego). Łączymy się po UDP jak widać, a nasze klucze mamy po kolei zdefiniowane w plikach, jakie stworzyliśmy – w keys.

Port forwarding

Usługa przekazywania portów z adresu publicznego na prywatny – w większości domowych ruterów nie jest specjalnie skomplikowana w konfiguracji – oto kilka przykładów:

Port Forwarding - Linksys
Port Forwarding – Linksys
Port Forwarding - D-Link DIR
Port Forwarding – D-Link DIR
Port Forwarding - Archer VR900
Port Forwarding – Archer VR900
Port Forwarding - TP-Link
Port Forwarding – TP-Link
Port Forwarding - TP-Link
Port Forwarding – TP-Link

Split-tunnel – bezpieczny dostęp do Internetu przez własny VPN

Aby zapewnić split-tunnel – należy zmienić koniec pliku /etc/rc.local.
U siebie musicie zmienić adres IP – w przykładzie 192.168.11.11 na adres IP Raspberry w Waszej sieci lokalnej, oraz wybrać sieć dla połączenia VPN – tutaj: 192.168.22.0/24

Plik powinien zawierać następujące wpisy:

Klient

Czas na konfigurację klienta. Zaczniemy od popularnych Androidów/iOS – a więc urządzeń mobilnych. Pobieramy klienta OpenVPN (uwaga na podróbki!) i po zainstalowaniu – okaze się, że klient chciałby plik .ovpn. A więc – należy go stworzyć:

Przechodzimy więc do konsoli a w pliku jaki stworzymy – zmieniamy IP_ADDRESS_OR_FQDN_OF_THE_SERVER na adres IP naszego serwera OpenVPN:

W wyniku otrzymamy plik client.ovpn. Plik należy przeglądnąć, dodać odpowiednio: proto na udp, remote – adres IP lub nazwę gdy używamy zmiennego IP i oraz posiadamy usługę aktualizacji w dynamicznym DNS (DynDNS) – oraz – wpisujemy zakres adresów w server. Usuń odniesienia (jeśli istniały w przykładzie) do plików z ca, cert, key. Gotowy plik przesyłamy i importujemy na naszym urządzeniu.




  • rhjrtyhj5

    dla ludzi uzywajacych sieci gms wazna informacja. nie da sie wywolac waszego ip. po prostu nie sa one widoczne z zewnatrz.
    jedyne rozwiazanie to ssh i wznawianie polaczen. stawiamy tunel ssh od maszyny do serwera posredniczacego i logujemy sie na tym serwerze a nie wbijamy bezposrednio na nasz domowy serwer

    • Łukasz C. Jokiel

      Tak, niestety to są sprawy nie podlegające negocjacji, ze względu na budowę dostępu dla sieci mobilnych

    • Dom

      w ub roku znajomy gadał w tej sprawie z operatorami, chciał mieć publiczne IP po LTE.

      Z tego co pamiętam, w Plusie można to zrobić, ale wiąże sie z wyższymi kosztami. No i na ten temat trzeba trafić do „odpowiedniego” handlowca biznesowego, który kuma czaczę i zna swój produkt. Idąc do sklepiku operatora lub dzwoniac na ogólny callcenter raczej się świata nie zawojuje.

  • Marcin P (pyby)

    „dla ludzi uzywajacych sieci gms wazna informacja. nie da sie wywolac waszego ip. po prostu nie sa one widoczne z zewnatrz.”

    rozumiem, że chodzi o gsm? w takim razie można uruchomić u operatora M2M np. http://gsmonline.pl/artykuly/,,maxprofit-m2m-2-promocja-plus-gsm
    lub http://www.t-mobile.pl/pl/dlafirm/rozwiazania-dla-firm/taryfa-telemetryczna
    czyli odblokowanie portów. Kosztuje 5-10 pln / m-c

  • Dom

    u mnie na świeżej instalacji przykładowe pliki zamiast w:

    /usr/share/doc/openvpn/examples/easy-rsa/2.0/
    są w:
    /usr/share//easy-rsa/

    • Łukasz C. Jokiel

      Jessie ? Sprawdzę i odnotuję, dzięki.

  • Łukasz C. Jokiel

    Wpis zaktualizowany do stanu OpenVPN oraz dystrybucji Jessie – w październiku 2016

    • Kuba Gerlée

      szczerze. to jak dla totalnego nowicjusza, to niektóre rzeczy dość malo wytłumaczone. Spróbowałem Pana poradnik,ale mam bardzo dużo pytań. Jeśli miałby Pan chwile jutro czy po jutrze, to mogę na bieżąco zadawać Panu pytania, i w taki sposób będzie można ulepszyć ten poradnik.

      • Łukasz C. Jokiel

        Jasne, zwykle wieczorami

  • Krzysztof

    Witam.

    OpenVPN Client na Windos nie łączy się po zaimportowaniu pliku client.ovpn .

    W logach jest błąd linii 14, czyli nie pasuje mu wpis :

    set CLIENT_CERT 0
    Poniżej fragment log’a.
    Na telefonie raz się łączy, a innym razem timeout…

    Options error: Unrecognized option or missing or extra parameter(s) in komp.ovpn:14: set (2.4.0)
    Use –help for more information.

    • Łukasz C. Jokiel

      Jeśli to ten sam plik to usuń linię z CLIENT_CERT 0 i sprawdź. Jeśli z klienta na Androidzie łączy się, to kwestia timeout’u to zapewne kwestia łącza – nie konfiguracji.

      • Krzysztof

        Działa 🙂 usunąłem linię z CLIENT_CER 0 oraz zrestartowałem openvpn na malince. Działa z kompa i z Androida. Dziękuję za pomoc i najlepszego wszystkiego w Nowym Roku ! 🙂

  • psopi

    Hmmm, how Can I use it when I don’t have access to router ? You mentioned about airport where is hardly possible to mess with router…

  • Michał Kiełpiński

    Nie mogę w Jessie utworzyć pliku przez „touch keys/index.txt” – pewnie dlatego, że nie mam takiego katalogu.
    Po utworzeniu katalogu i pliku pojedynczo (w katalogu /etc/openvpn/easy-rsa/), próba wywołania
    echo 01 > keys/serial
    również kończy się komunikatem o braku takiego pliku (po instalacji i skopiowaniu OVPN do etc, katalogu keys nie ma w /easy-rsa).

    Czy katalogu keys należy szukać w innym miejscu?

    • Łukasz C. Jokiel

      Zawartość się zmienia, trzeba się dostosować. Sprawdzę jak to wygląda w weekend.

      • Michał Kiełpiński

        Stworzyłem katalog i pliki, reszta poszła. Tylko przy ./build-key-pass client na końcu mam błąd TXT_DB error number 2

        • Łukasz C. Jokiel

          Ustaw inny common name dla klientów – client1, client2, ustawiłeś ten sam jak generowałeś wcześniej