Raspberry Pi – szczypta prywatności dla każdego
O tym jakim kombajnem do wszystkiego jest ten niepozorny mały komputerek chyba wszyscy już wiemy. Możemy na nim postawić serwer www, bazę danych, centrum multimedialne, stację pogodową, serwer NAS czy co tam dusza zapragnie. Dziś dowiemy się jak zwiększyć naszą prywatność, kiedy korzystamy z otwartych punktów WiFi poza domem – nasza malinka posłuży nam jako domowy serwer OpenVPN. Dzięki takiemu serwerowi będziemy mogli cały nasz ruch sieciowy z jakiegoś darmowego hotspotu wifi przekierować przez prywatny tunel biegnący przez nasze domowe łącze.
Jakie mamy IP?
Pierwszą rzeczą, którą należy sprawdzić przed instalacją OpenVPN na malinie jest sprawdzenie jak przydzielany jest nam zewnętrzny adres IP. Jeżeli posiadamy stały adres to super, możemy pominąć ten krok. Jeżeli jednak nasz adres IP jest zmienny (co jest bardzo prawdopodobne jeżeli nie jesteśmy klientem biznesowym) musimy zadbać o to, aby zawsze go znać. Jednym ze sposobów jest skonfigurowanie na naszym routerze usługi DDNS.
W skrócie polega ona na tym, że dostajemy od dostawcy usługi DDNS nazwę domenową np. mojrouter.uslugodawca.com, która zawsze będzie wskazywała na nasz aktualny zewnętrzny adres IP. Dzięki temu taka nazwa jest łatwa do zapamiętania, a jednocześnie zawsze wskazuje na dobry adres.
Pierwsze co musimy zrobić to wybrać dostawcę usługi DDNS. Jednym z najbardziej popularnych i darmowych jest No-IP. Musimy założyć w takim serwisie konto, a następnie wprowadzić nasze dane w routerze.
Kiedy już nasza domena wskazuje na nasz adres IP możemy przejść do kolejnego kroku :)
Instalacja serwera OpenVPN
Pierwsze co robimy przy instalacji jakiegokolwiek oprogramowania to oczywiście
sudo apt-get update sudo apt-get upgrade
Następnie instalujemy głównego zainteresowanego dzisiaj:
sudo apt-get install openvpn
Razem z openvpn powinno nam się zainstalować easy-rsa. Po wpisaniu w konsolę
whereis easy-rsa
wyświetli nam się w odpowiedzi ścieżka instalacji easy-rsa. U mnie jest on zainstalowany w
/usr/share/easy-rsa
Przejdźmy więc do tego katalogu i za pomocą edytora nano edytujmy plik vars.
Możemy w nim znaleźć np. taką linijkę:
export KEY_SIZE=2048
jeżeli nie jesteśmy aktualnie ścigani przez NSA to z czystym sumieniem możemy zmienić wartość 2048 na 1024. Przyspieszy to generowanie klucza, który i tak będzie ciężki do złamania.
Teraz w celu uniknięcia problemów warto przełączyć się na roota poprzez wpisanie
sudo su
Kiedy jesteśmy już szefem wszystkich szefów możemy po kolei uruchomić następujące polecenia (sprawdzając oczywiście, czy nie wystąpiły żadne błędy):
source ./vars ./clean-all ./build-ca
Teraz możemy wygenerować klucz prywatny serwera wpisując
./build-key-server server
Tutaj wszystkie opcje o które nas pyta mogą być domyślne. Ważne, aby pole Common name było nazwane server.
Skrypt zada nam na koniec 2 pytania:
Sign the certificate?
oraz
1 out of 1 certificate requests certified, commit?
na oba oczywiście odpowiadamy twierdząco wciskając klawisz Y.
Generowanie kluczy dla klientów
Klucz klienta generujemy podobnie jak serwerowy. Wpisujemy polecenie
./build-key-pass nazwa_uzytkownika
Następnie podajemy 2 razy hasło, któego będziemy używali i wypełniamy resztę danych. Możemy zostawić je domyślne tak jak są.
Teraz przechodizmy do katalogu keys
cd keys
i wykonujemy następujące polecenie
openssl rsa -in nazwa_uzytkownika.key -des3 -out nazwa_uzytkownika.3des.key
i wracamy katalog wyżej
cd ..
Generowanie parametrów dla protokołu Diffiego-Hellmana
Teraz część, która będzie się wykonywała najdłużej. Musimy wygenerować parametry dla protokołu uzgadniania kluczy szyfrujących. Aby to zrobić wpisujemy w konsolę
./build-dh
a następnie idziemy zrobić sobie kawę.
Kiedy już skrypt build-dh zakończy działanie wpisujemy do konsoli polecenie
openvpn --genkey --secret keys/ta.key
Konfiguracja serwera OpenVPN
Przejdźmy teraz do folderu /etc/openvpn
cd /etc/openvpn/
i utwórzmy w nim plik server.conf
nano server.conf
po czym wklejamy do niego następującą treść:
local 192.168.1.110 dev tun proto udp port 1194 ca /usr/share/easy-rsa/keys/ca.crt cert /usr/share/easy-rsa/keys/server.crt key /usr/share/easy-rsa/keys/server.key dh /usr/share/easy-rsa/keys/dh1024.pem 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" push "route 192.168.1.110 255.255.255.0" push "dhcp-option DNS 8.8.8.8" push "redirect-gateway def1" client-to-client duplicate-cn keepalive 10 120 tls-auth /usr/share/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
Edytując kilka linijek. Interesować nas będą te o numerach 1, 13 oraz 8 jeżeli zostaliśmy przy 2048 bitowym kluczu szyfrującym.
W linijce numer 1 ustawiamy lokalny adres IP malinki. Podobnie robimy w linijce 13, z tym że tam dodajemy jeszcze maskę podsieci. W linijce numer 8 możemy zmienić plik .pem na dh2048 jeżeli takeigo użyliśmy.
Dodatkowo w linijce numer 14 możemy ustawić serwer DNS na adres naszego routera. Domyślnie wpisałem tam googlowy DNS.
Konfiguracja Raspberry
Ok, skoro serwer OpenVPN już skonfigurowany to teraz czas na konfigurację Raspberry. Musimy zezwolić na przekierowanie ruchu sieciowego. Zedytujmy więc za pomocą nano plik /etc/sysctl.conf.
Szukamy w nim linijki opisanej w ten sposób: Uncomment the next line to enable packet forwarding for IPv4.
I robimy to co nam każą, czyli usuwamy znak # z początku linijki
#net.ipv4.ip_forward=1
Teraz zaipsujemy plik i odświeżamy ustawienia wpisując do konsoli
sysctl -p
Dodajemy odpowiednie reguły do firewalla:
iptables -A INPUT -i tun+ -j ACCEPT iptables -A OUTPUT -o tun+ -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE iptables -I FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -d ADRES_NASZEJ_SIECI -m conntrack --ctstate NEW -j ACCEPT iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT iptables -A FORWARD -i tun+ -j ACCEPT iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
w linijce 4 pamiętając o zmianie ADRES_NASZEJ_SIECI na adres naszej sieci, czyli np. jeżeli adresem IP malinki jest 192.168.1.50 z maską 255.255.255.0 to wpisujemy tam 192.168.1.0/24
Teraz możemy zrobić reboot malinki.
Tworzymy plik .ovpn
Pomoże nam w tym gotowy skrypt, który możemy ściągnąć stąd: https://gist.github.com/laurenorsini/10013430
Zapisujemy go w folderze /usr/share/easy-rsa/keys, a następnie nadajemy mu prawa wykonywania poprzez
chmod +x MakeOpenVPN.sh
Po tej czynności tworzymy w tym folderze plik Default.txt
nano Default.txt
i wklejamy do niego następującą zawartość:
client dev tun proto udp remote NASZ_ZEWNETRZNY_ADRES_IP 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
wpisując w linijce 4 nasz zewnętrzny adres IP.
Teraz pora wykonać plik MakeOpenVPN.sh
./MakeOpenVPN.sh
Powinien on zapytać nas o nazwę naszego klienta, a następnie wygenerować plik o takiej nazwie z rozszerzeniem .ovpn
Kopiujemy utworzony plik na komputer
Jeżeli wszystko poszło zgodnie z planem możemy skopiować wygenerowany plik na nasz komputer. W tym celu możemy połączyć się z malinką jak ze zwykłym FTP (tyle że na porcie 22) np. programem FileZilla, a następnie przejść do katalogu /usr/share/easy-rsa/keys/. Prawdopodobnie nie będziemy mieli do niego dostępu dlatego na malince musimy wydać polecenie
chmod 777 /usr/share/easy-rsa/keys/
Łączymy się z serwerem
Ściągami i instalujemy klienta OpenVPN z https://openvpn.net/index.php/open-source/downloads.html
Następnie klikamy prawym przyciskiem myszy na nasz ściągnięty plik z configiem i wybieramy ipcję „Start OpenVPN on this config file”
Pamiętajmy też, że musimy przekierować port UDP 1194 naszej malinki na routerze, aby był widoczny z zewnątrz.
Bardzo ciekawy i pożyteczny artykuł, jednak zamiast zmieniać prawa dostępu do folderu systemowego, proponowałbym po stronie malinki skopiować plik *.OVPN do folderu dostępnego przez FTP i zmienić jego właściciela na użytkownika FTP. Potem oczywiście z malinki go skasować.