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ć.
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 !