Instalacja i konfiguracja sieci VPN na OpenWrt
Ostatnia zmiana: 2017-12-09 10:10

OpenVPN jest projektem umożliwiającym utworzenie VPN - czyli sieci prywatnej, do której mamy dostęp przez kodowany tunel ip. OpenVPN umożliwia utworzenie wielu różnych konfiguracji: łączenie sieci, osobne kanały rutowalne dla klientów itd. W tym HOWTO opisana jest konfiguracja tzw. road-warrior - czyli stacja kliencka (np. laptop z Windowem) podłącza się z internetu do sieci lokalnej i ma możliwość korzystania z jej zasobów. Możliwości zabezpieczenia połączenia jest wiele (login/hasło, certyfikaty, różne rodzaje kodowania itd). W tym rozwiązaniu wykorzystano jeden plik z tajnym kluczem.

Jak wygląda w praktyce korzystanie z VPN? Będąc podłączonym do internetu uruchamiamy klienta vpn. Tworzy się wirtualne połączenie z naszą siecią, dostajemy adres z puli naszego rutera i można korzystać z zasobów sieci lokalnej - czy to serwera plików, czy klienta torrentów na serwerze, jak również mamy dostęp do udostępnionych zasobów dyskowych w Windows. Zaleta stosowania vpn - tylko jeden otwarty port na firewallu, dostęp do dowolnych zasobów w sieci lokalnej. Wada - potrzeba instalacji klienta VPN na danym komputerze.

Rozwiązanie przetestowano na OpenWrt Kamikaze 8.09.x w roli serwera oraz Windows XP Home / Linux Debian jako klient. Router musi posiadać adres publiczny.

Instalacja oprogramowania

Ruter musi mieć ustawioną aktualną godzinę, inaczej będzie problem z zestawieniem połączenia. Należy więc ustawić odpowiednią strefę czasową oraz zainstalować klienta czasu


    # uci set system.@system[0].timezone=CET-1CEST,M3.5.0,M10.5.0/3
    # uci commit system
    # opkg update
    # opkg install ntpclient
    # reboot

Następnym krokiem jest instalacja samego pakietu OpenVPN


    # opkg install openvpn

(w nowych wydaniach pakiet nazywa się openvpn-openssl)

Konfiguracja

Firewall

Należy zezwolić na komunikacje po porcie 1194/udp


    # uci add firewall rule
    # uci set firewall.@rule[-1]._name=openvpn
    # uci set firewall.@rule[-1].src=wan
    # uci set firewall.@rule[-1].target=ACCEPT
    # uci set firewall.@rule[-1].proto=udp
    # uci set firewall.@rule[-1].dest_port=1194
    # uci commit firewall
    # echo "iptables -I OUTPUT -o tap+ -j ACCEPT" >> /etc/firewall.user
    # echo "iptables -I INPUT -i tap+ -j ACCEPT" >> /etc/firewall.user
    # echo "iptables -I FORWARD -o tap+ -j ACCEPT" >> /etc/firewall.user
    # echo "iptables -I FORWARD -i tap+ -j ACCEPT" >> /etc/firewall.user

OpenVPN

Włączenie odpowiedniej sekcji konfiguracji


    # mkdir -p /etc/openvpn/
    # uci set openvpn.myvpn=openvpn
    # uci set openvpn.myvpn.config=/etc/openvpn/my-vpn.conf
    # uci set openvpn.myvpn.enable=1
    # uci commit openvpn
    # /etc/init.d/openvpn enable
    # /etc/init.d/openvpn start

Następnie należy utworzyć odpowiednią konfigurację serwera vpn w pliku /etc/openvpn/my-vpn.conf. Np. taką:


    port 1194
    proto udp
    dev tap0
    keepalive 10 120
    status /tmp/openvpn-status.log
    verb 3
    secret /etc/openvpn/secret.key

Ponieważ w założeniach było, że klient ma otrzymywać adres z puli sieci lokalnej, należy jeszcze utworzyć odpowiednie połączenie (bridge) pomiędzy OpenVPN a interfejsem lan. W tym celu tworzymy dodatkowy plik zawierający polecenia łączenia tych interfejsów przy starcie systemu (np o nazwie /etc/init.d/openvpn-startup)


    #!/bin/sh /etc/rc.common
    
    START=94
    
    start() {
        openvpn --mktun --dev tap0
        brctl addif br-lan tap0
        ifconfig tap0 0.0.0.0 promisc up
    }
                                                                                
    stop() {
        ifconfig tap0 0.0.0.0 down
        brctl delif br-lan tap0
        openvpn --rmtun --dev tap0
    }

Zostaje jeszcze włączenie tego pliku do procedur startowych systemu


    # chmod 755 /etc/init.d/openvpn-startup
    # /etc/init.d/openvpn-startup enable
    # /etc/init.d/openvpn-startup start

Generacja klucza współdzielonego

Windows
Po instalacji OpenVPN (patrz następny dział) trzeba się posłużyć programem kryjącym się pod nazwą Generate a static OpenVPN key w menu OpenVPN.
Wygeneruje on plik key.txt który trzeba skopiować na ruter do katalogu /etc/openvpn pod nazwą secret.key.

Linux


    $ openvpn --genkey --secret secret.key

Plik należy skopiować do rutera do katalogu /etc/openvpn pod nazwą secret.key

Konfiguracja klienta Windows

Instalujemy pakiet http://swupdate.openvpn.net/community/releases/openvpn-2.1.4-install.exe . Następnie należy w utworzyć plik o nazwie np. my_vpn.ovpn w katalogu C:\Program Files\OpenVPN\config o następującej zawartości


    dev tap
    proto udp
    remote XXX.XXX.XXX.XXX 1194
    resolv-retry infinite
    nobind
    mute-replay-warnings
    secret "c:\\Program Files\\OpenVPN\\config\\secret.key"
    verb 3
    float

W tym katalogu należy też umieścić plik secret.key. Oczywiście plik można trzymać np. na pendrive, wtedy w konfiguracji należy podać odpowiednią ścieżkę, np. e:\\secret.key (zakładając że e: to pendrive czy inny bezpieczny nośnik). Za XXX.XXX.XXX.XXX należy podstawić publiczny adres IP naszego rutera.
    
Należy jeszcze odblokować zaporę sieciową w windows: Control Panel -> Security Center -> Windows Firewall -> Advanced. W Network Connection Settings odznaczyć checkbox który odnosi się do połączenia vpn. Po restarcie windowsa w tacce systemowej będzie dostępna ikona OpenVPN-GUI - przy pomocy prawego przycisku myszy należy wybrać opcję "Connect". Pojawi się okno informacyjne i po chwili zostaniemy połączeni z naszą siecią. Od tego momentu można normalnie dostać się do rutera, udostępnionego dysku przez sambę czy klienta torrentów.
Należy pamiętać, żeby klienta OpenVPN uruchamiać z odpowiednimi prawami np. administratora systemu. W przeciwnym przypadku może być problem np. z ustawieniem odpowiednich tablic routingu.

Konfiguracja klienta Linux

Należy zainstalować pakiet openvpn dostępny w dystrybucji. Następnie tworzymy plik o nazwie np. my_vpn.ovpn w katalogu /opt o następującej zawartości


    dev tap
    proto udp
    remote XXX.XXX.XXX.XXX 1194
    resolv-retry infinite
    nobind
    mute-replay-warnings
    secret /opt/secret.key
    verb 3
    float

W tym katalogu (/opt) należy też umieścić plik secret.key. Za XXX.XXX.XXX.XXX należy podstawić publiczny adres IP naszego rutera.
Uruchomienie:


    # openvpn --config /opt/my_vpn.ovpn
    # ifconfig tap0 up
    # dhclient tap0

Należy jeszcze sprawdzić jak się utworzyły trasy (route) i np. usunąć trasę domyślną przez tap0 jeżeli taka się dodała.

Do testów można użyć w/w konfiguracji. Do "normalnej" pracy powinno użyć się sposobu konfigurowania sieci zgodnej z daną dystrybucją. W linuksie można posłużyć się NetworkManagerem i opcją VPN (dostępną po instalacji odpowiednich pakietów).

Zakończenie

Plik secret.key należy zachować w bezpiecznym miejscu, gdyż tylko on odpowiada za autoryzację w sieci.
Adres IP pobierany jest rutera. Jeżeli używamy standardowej klasy adresowej (192.168.1.0/24) a klient jest podłączony do sieci w takiej samej klasie to połączenie nie zadziała (będzie problem z rutowaniem pakietów).
Sposobów konfiguracji OpenVPN jest dużo i to opracowanie nie zawiera wszystkich metod. Dlatego też należy samodzielnie dostosować konfigurację do własnych wymagań. Na początek należy zapoznać się z dokumentami w witrynie projektu: http://openvpn.net oraz http://openvpn.se .

Przykład łączenia dwóch sieci przy pomocy OpenVPN można znaleźć w tym dokumencie.
Typową konfigruację "Road Warrior", z certyfikatami można znaleźć na forum openwrt