Ikona OpenVPN

Instalacja i konfiguracja OpenVPN na CentOS 6 z autoryzacją kluczem

Jedno podejście do instalacji i konfiguracji OpenVPN na CentOS 6 już miałem. Jednakże, jak zauważył jeden z czytelników – wykorzystałem autoryzację PAM zamiast skorzystać z logowania za pomocą kluczy.

Przyznam, że miałem z tym trochę problemów, a zmobilizował mnie do tego Rafał we wpisie openvpn debian – nie dawało mi spokoju, że można to zrobić prościej i szybciej. Dać dostęp innym osobom bez tworzenia zbędnego użytkownika w systemie i podawani innym haseł.

Ok, do rzeczy.

Instalacja OpenVPN

yum install openvpn easy-rsa
Do poprawnej instalacji i konfiguracji, jaką obejmuje ten wpis, potrzebne jest Easy-RSA w wersji 2. W chwili pisania poprzedniego wpisu repozytoria CentOSa nie posiadały w ogóle tej paczki. Obecnie mają wersję 2.2.0.

Konfiguracja OpenVPN i Easy-RSA

cd /etc/openvpn/
mkdir easy-rsa
cp -r /usr/share/easy-rsa/2.0/* easy-rsa/
cd easy-rsa/
vim vars

W pliku vars edytujemy linię export KEY_SIZE=1024 zmieniając wartość na np. 2048, lub paranoidalną 4096. Zapisujemy, wychodzimy.

. ./vars
./clean-all
./build-ca #generuje certyfikat SSL, dane uzupełniamy wg własnego "widzimisia"
./build-key-server server #generuje klucz serwera, dane wg "uznania"
./build-key client #podobnie jak wyżej
./build-dh #chwilę to potrwa
build-key client możemy wygenerować dowolny klucz dla użytkowników. Może to być klucz dla Jana, Kasi, Basi, telefonu. W tym celu zmieniamy nazwę client na np. telefon. Podczas generowania istotne by również zachować podobną terminologię. PRZYKŁAD

Następnie generujemy klucz publiczny:

openvpn --genkey --secret ta.key
mv ta.key keys/

Przechodzimy do konfiguracji serwera OpenVPN. Tworzymy plik server.conf.

cd /etc/openvpn/
vim server.conf

A w nim zawieramy naszą konfigurację:

port xxxx #definiujemy port, na którym nasłuchiwać ma OpenVPN
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dhxxxx.pem #w zależności jaką wartość wpisaliśmy może być 1024, 2048, 4096
server 10.0.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
comp-lzo
user nobody
group nobody
persist-key
persist-tun
log-append /var/log/openvpn/openvpn.log
status /var/log/openvpn/status.log
verb 3

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

Plik konfiguracyjny dla komputera

By móc się połączyć z serwerem potrzebujemy odpowiednio przygotowany plik konfiguracyjny. Zadziała zarówno na Windowsie jak i Androidzie.

client
dev tun
proto tcp
remote 123.456.789.12 xxxx #ip port
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
ca ca.crt
cert client.crt #adres do klucza użytkownika
key client.key #j/w
ns-cert-type server
tls-auth ta.key 1
comp-lzo
verb 3

Zapisujemy w c:\Program Files\OpenVPN\config\ – tam również zapisujemy takie pliki jak: ca.crt, ta.key, client.crt i client.key. Wszystkie znajdują się w /etc/openvpn/easy-rsa/keys.

Start OpenVPN:

service openvpn start

Komentarze

11 odpowiedzi na „Instalacja i konfiguracja OpenVPN na CentOS 6 z autoryzacją kluczem”

  1. Następnie generujemy klucz publiczny:
    openkey –genkey –secret ta.key

    hmm, a nie openvpn –genkey –secret ta.key?

    1. Słusznie! :) Już poprawiam. Dzięki.

  2. Korzystając z okazji może wiesz jak to zrobić. Zainstalowałem OpenVPN AS. W zakładkach konfiguracji web mam możliwość włączenia 2-etapowej weryfikacji Google authenticator. Co trzeba zrobić oprócz zaznaczania „ptaszka” aby to działało? Trzeba coś doinstalować? W takich wypadkach skanuje się zwykle kod QR – szukałem czegoś na ten temat ale jestem nieco zdezorientowany.

    Dwa czy bezpiecznym jest aby dostęp do konfiguracji OpenVPN był via web:port można jakoś ograniczyć dostęp do tej strony konfiguracyjnej?

    Dzięki

    1. Nie korzystam z tego, więc nie mam pojęcia szczerze powiedziawszy. Generuję sobie klucze do konfiguracji.

      Jeśli są jakieś dane logowania to nie powinno nic się stać. Ja osobiście blokuję dostęp do wszelakich paneli dla innych IP niż moje + lokalne z openvpn. Nie dostaniesz się np. do SSH mojego jeśli nie masz dostępu do mojego lokalnego IP albo VPNa ;).

  3. Awatar Czarek

    Witam.Zestawiłem połączenie przez openvpn i teraz chciałem zamapować katalog z linuxa na win7.
    Niestety nie wiem jak to zrobić. Czy mógłbym liczyć na jakąś podpowiedź??
    Czarek

    1. Jeśli dobrze zrozumiałem to chcesz zrobić coś takiego jak oferuje samba. Zainstaluj na Linuksie sambę. Po udostępnieniu konkretnych folderów powinny być one wówczas widoczne na Windowsie.

      Ja polecam btsync jednak. O wiele prostszy w konfiguracji i możesz udostępnić „na zewnątrz” też. Opis tutaj.

  4. Witam. Dzięki za podpowiedż z btsync. Super.
    Ale pojawił mi się problem z wieloma użytkownikami.
    Chciałbym aby przez openvpn moglo się łączyć kilku uzytkowników.
    Wygląda na to, że z jednego klucza może korzystać jeden użytkownik.
    Jak wygenerować kilka kluczy, osobno dla każdego użytkownika??
    Jak podaje komendę ./clean all to poprzednie klucze są usuwane.

    1. W zasadzie to klucze generujesz tylko tym poleceniem:
      ./build-key client

      Możesz wygenerować kilka kluczy:
      ./build-key kasia
      ./build-key tomek

      Dokumentacja OpenVPN w sekcji Generate certificates & keys for 3 clients.

      Następnie dla każdego użytkownika musisz przygotować plik *.ovpn, gdzie zmieniasz po prostu nazwy kluczy dla nich:
      […]
      cert kasia.crt
      key kasia.key
      […]

      […]
      cert tomek.crt
      key tomek.key
      […]

      Wydanie polecenia ./clean-all czyści wszystkie klucze, więc nie dziw się :)

      1. Dziękuje za pomoc. Klucze wygenerowałem ale teraz masuwa się nowe pytanie.
        Jak dodać nowy klucz użytkownika do już wygenerowanych kluczy?

        1. Czy za każdym razem trzeba clean all i generować wszystko od nowa??

          1. E nie, powinno wystarczyć wygenerowanie nowego klucza dla konkretnej osoby. Bez ponownego generowania całości i czyszczenia :).

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *