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.