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.