Instalacja i konfiguracja OpenVPN na serwerze VPS z CentOS 6

Ikona OpenVPN

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.

O tym, co daje nam tunelowanie i jakie profity za sobą niesie poczytacie w sieci. Największą zaletą jest korzystanie z tunelowania w otwartych sieciach (Hotspoty, otwarte wifi). W skrócie: połączenie jest szyfrowane do naszego serwera, i komunikujemy się z internetem tak jakby za jego pomocą a nie naszego urządzenia. Zakręcone, wiem.

Przygotowanie

Z rzeczy, które potrzebujemy na sam początek, to:

  1. Serwer z CentOSem w wersji 6 (na niej instalowałem program);
  2. Zainstalowane repozytoria Epel oraz RPMForge (opis tutaj).
Do prawidłowego działania na serwerze musi być uruchomiony moduł TUN/TAP. W celu jego włączenia skontaktuj się z dostawcą, albo zrób to za pomocą odpowiedniej opcji w panelu zarządzania.

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

Jeśli masz zainstalowane CSF, to po każdej aktualizacji reguł, albo restarcie CSF reguły iptables są nadpisywane i należy je ponownie dodawać, albo ręcznie resetować iptables. Jest jednak rozwiązanie. W katalogu /etc/csf/ tworzymy plik csfpost.sh, do którego wklejamy powyższe reguły. Plik zapisujemy i nadajemy mu prawa do wykonania: chmod +x csfpost.sh.

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ść:

Oczywiście musimy mieć zainstalowany program OpenVPN, który można pobrać stąd.
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.

Program OpenVPN GUI uruchamiamy z uprawnieniami administratora.

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.

  1. Podajemy dane logowania.
  2. Klikamy na connect.
  3. Zmieniamy ustawienia zabezpieczeń.
  4. Instalujemy klucz .p12 (należy wpisać podane hasło przy konwertowaniu z klucza .crt).
  5. 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.
Konfiguracja OpenVPN na Androidzie

Konfiguracja OpenVPN na Androidzie

I to tyle :).

P.S. Dziękuję również Fenne za naprowadzenie w paru sprawach i pomoc.

Ten wpis został opublikowany w kategorii Android, Internet, Linux, Techniczne i oznaczony tagami , , , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

4 odpowiedzi na „Instalacja i konfiguracja OpenVPN na serwerze VPS z CentOS 6

  1. night pisze:

    Drogi Autorze, dlaczego tak mocno uparłeś się na autoryzację poprzez mechanizm PAM?
    Przedstawiony konfig zawiera ca, cert i key…
    Czy istnieje jakiś rozsądny argument, ażeby w przypadku kilku użytkowników nie utworzyć dla każdego osobny zestaw cert + key z pominięciem PAMa?

    • inzaghi89 pisze:

      To nie jest kwestia „uparcia się”. Nie szukałem innych alternatyw, bo nie przyszło mi nawet do głowy rozwiązanie za pomocą kluczy. Na szczęście kolega pakos rozwiązał ten problem w swoim wpisie :). Nie będę więc dublował rozwiązania.

      Konfiguracja za pomocą kluczy znajduje się tutaj: http://blog.pakos.biz/2013/07/openvpn-debian/

      I owszem, masz @night rację. Jest to lepsze rozwiązanie, by uwierzytelniać się kluczem, a nie loginem :).

  2. Pingback: openvpn debian | Pakos

  3. domix pisze:

    Bardzo fajnie opisana konfiguracja i miło że na inny system niż Debian.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*