Dwa dni zajęło mi uruchomienie OpenVPN z możliwością tunelowania na VPSie z CentOSem. Było to jednak dość ciekawe doświadczenie :). Wiedząc jednak, że nie prędko będę miał przyjemność zrobić to ponownie – napiszę o przebiegu instalacji. Może komuś poza mną się to jeszcze kiedyś przyda.
Przygotowanie
Z rzeczy, które potrzebujemy na sam początek, to:
- Serwer z CentOSem w wersji 6 (na niej instalowałem program);
- Zainstalowane repozytoria Epel oraz RPMForge (opis tutaj).
Instalacja i konfiguracja OpenVPN
OpenVPN znajduje się w repozytoriach epel. Wykonujemy polecenie:
yum install openvpn -y
Następnie:
yum downgrade openvpn cp -r /usr/share/openvpn/plugin/ /usr/share/openvpn/plugins/ yum update -y mv /usr/share/openvpn/plugins/ /usr/share/openvpn/plugin/
Nowa wersja OpenVPN nie zawiera pluginów, które miała poprzednia. Dlatego czynność ta jest niezbędna.
Kolejnym krokiem jest pobranie kluczy RSA:
wget https://github.com/OpenVPN/easy-rsa/archive/master.tar.gz
Z archiwum kopiujemy katalog easy-rsa (w nim znajdują się 3 katalogi: 1.0, 2.0 oraz Windows) do: /etc/openvpn/.
cd /etc/openvpn/easy-rsa/2.0/ vim vars
W pliku należy odnaleźć linię
export KEY_CONFIG='$EASY_RSA/whichopensslcnf $EASY_RSA'
i zastąpić ją następującą
export KEY_CONFIG=/etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf
Tworzenie certyfikatów
chmod 755 * source ./vars ./vars ./clean-all #w kolejnych krokach uzupełniamy wymagane dane, albo wpisujemy kropkę "." by pole zostało puste ./build-ca ./build-key-server server ./build-dh
Tworzenie pliku konfiguracyjnego
vim /etc/openvpn/server.conf
Do pliku wklejamy poniższą zawartość:
port 1194 #- port proto udp #- protocol dev tun tun-mtu 1500 tun-mtu-extra 32 mssfix 1450 reneg-sec 0 ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt cert /etc/openvpn/easy-rsa/2.0/keys/server.crt key /etc/openvpn/easy-rsa/2.0/keys/server.key dh /etc/openvpn/easy-rsa/2.0/keys/dh2048.pem plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so /etc/pam.d/login #- Comment this line if you are using FreeRADIUS #plugin /etc/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf #- Uncomment this line if you are using FreeRADIUS client-cert-not-required username-as-common-name server 10.0.0.0 255.255.255.0 push "redirect-gateway def1" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" keepalive 5 30 comp-lzo persist-key persist-tun status /var/log/openvpn.log verb 3
Teraz możemy uruchomić serwer OpenVPN:
service openvpn start
Włączenie przekierowania ruchu
Bardzo ważne jest, by nasz serwer przekierowywał ruch.
vim /etc/sysctl.conf
Odnajdujemy linię
net.ipv4.ip_forward
i zamieniamy wartość 0, na 1.
Ładujemy wprowadzone zmiany:
sysctl -p
Tworzenie użytkownika bez dostępu do shella
Dość ważny krok. Szkoda przecież, by nasze konto wpadło w niepowołane ręce i ktoś uzyskał dostęp do serwera. Lepiej utworzyć nowe konto z łatwiejszym hasłem ale bez dostępu do powłoki.
useradd vpnuser -s /bin/false passwd vpnuser
Tworzenie reguł do iptables
Gwarantuję, że bez tego tunelowanie nie zadziała. Połączymy się z serwerem, ale na tym skończy się funkcjonalność VPNa – a przynajmniej u mnie tak to się skończyło.
By wszystko działało jak należy – dla serwera na OpenVZ i zainstalowanym CSF tworzymy następujące reguły:
iptables -t nat -A POSTROUTING -o venet0 -j SNAT --to-source 123.456.789.12 iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 123.456.789.12 iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT iptables -A FORWARD -j REJECT iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o venet0 iptables -t nat -A POSTROUTING -j SNAT --to-source 123.456.789.12
Po stronie serwera jest to już niemal wszystko. Potrzebujemy jeszcze skopiować plik z certyfikatem i zapisać zmiany w iptables.
service iptables save cp /etc/openvpn/easy-rsa/2.0/keys/ca.crt /var/www/naszastrona/
Dzięki temu wchodząc na naszą stronę www będziemy mogli pobrać certyfikat na dysk. Np. http://keepmind.eu/ca.crt
Tworzenie pliku konfiguracyjnego dla Windowsa
Otwieramy notatnik i wklejamy następującą zawartość:
client dev tun proto udp remote 123.456.789.12 1194 # - Your server IP and OpenVPN Port resolv-retry infinite nobind tun-mtu 1500 tun-mtu-extra 32 mssfix 1450 persist-key persist-tun ca ca.crt auth-user-pass comp-lzo reneg-sec 0 verb 3
Zapisujemy w C:\Program Files\OpenVPN\config\ jako plik serwer.ovpn. Tam też kopiujemy pobrany plik ca.crt.
Od teraz uruchamiając OpenVPN GUI możemy zalogować się podanymi danymi użytkownika, którego utworzyliśmy i tunelować połączenie.
To tyle, jeśli chodzi o konfigurację dla Windowsa. Teraz pora na klienta Androida.
Cały opis bazowany jest na wpisie How to Build OpenVPN Server on CentOS 6.x autorstwa Sawiyati, któremu serdecznie dziękuję za udostępnienie tutoriala. Odsyłam tam również po bardziej szczegółowy opis instalacji (autor wzbogacił wpis o zrzuty ekranu, co sam postanowiłem sobie odpuścić, by nie dublować pracy).
Konfiguracja OpenVPN dla Androida
Program, o którym mowa znajduje się pod adresem https://play.google.com/store/apps/details?id=net.openvpn.openvpn – oczywiście musimy go zainstalować.
Problem, z którym borykałem się przez dłuższą chwilę dotyczy faktu, iż wersja Androidowa obsługuje jedynie klucze PKCS12 (my generowaliśmy crt). Należy więc przekonwertować utworzony wcześniej klucz do .p12:
cd /etc/openvpn/easy-rsa/2.0/keys/ openssl pkcs12 -export -in server.crt -inkey server.key -certfile ca.crt -name server -out server.p12 #podajemy dowolne hasło - jest to wymagany krok. W przeciwnym razie nie zaimportujemy klucza cp server.p12 /var/www/naszastrona/
Pobieramy klucz podobnie jak miało to miejsce w przypadku ca.crt.
Wszystkie 3 pliki: ca.crt, serwer.ovpn oraz server.p12 kopiujemy na nasze urządzenie w dowolne miejsce. Może być to karta pamięci. Po uruchomieniu programu OpenVPN wchodzimy do menu i wybieramy opcję importu profilu i wybieramy plik *.ovpn.
- Podajemy dane logowania.
- Klikamy na connect.
- Zmieniamy ustawienia zabezpieczeń.
- Instalujemy klucz .p12 (należy wpisać podane hasło przy konwertowaniu z klucza .crt).
- Klikamy wstecz (aplikacja się przywiesza i sama dalej nic nie zrobi) i ponownie klikamy na connect, akceptując równocześnie połączenie za pomocą klucza.
I to tyle :).
P.S. Dziękuję również Fenne za naprowadzenie w paru sprawach i pomoc.
Dodaj komentarz