openconnect - anyconnect, firmowy VPN

Opiszę tutaj sposób w jaki możemy przenieść klienta VPN (Cisco AnyConnect) zainstalowanego w systemie "Windows 10" na router NEWIFI-D2 z zainstalowanym firmware padavan wykorzystując aplikacje OpenConnect.

W moim przypadku autoryzacja do sieci VPN w aplikacji Cisco AnyConnect oprócz podania hasła potrzebuje również certyfikatu, który jest zapisany na naszym komputerze. Najpierw otwieramy plik konfiguracyjny AnyConnect:

C:\Users\%USERNAME%\AppData\Local\Cisco\Cisco AnyConnect Secure Mobility Client\preferences.xml

W pliku tym znacznik "ClientCertificateThumbprint" to identyfikator, który określa certyfikat używany do autoryzacji.

Otwieramy narzędzie do zarządzania certyfikatami - "certlm.msc" a następnie w folderze "Personal -> Certificates" szukamy certyfikatu, który posiada taki sam identyfikator w pozycji "Thumbprint"

Certyfikat ten musimy zapisać razem z kluczem prywatnym - tutaj pojawia się pierwszy problem ponieważ eksport klucza prywatnego został zablokowany.

Tutaj z pomocą przychodzi projekt o nazwie Jailbreak, który umożliwia eksport klucza prywatnego. Edytujemy plik o nazwie "jbcert64.bat" w następujący sposób:

@jailbreak64.exe %WINDIR%\system32\mmc.exe %WINDIR%\system32\certlm.msc -64

Teraz mamy możliwość uruchomienia skryptu oraz zapisania certyfikatu razem z kluczem prywatnym. Certyfikat zapisujemy w formacie "Personal Information Exchange – PKCS #12 (.PFX)" który następnie musimy przekonwertować do postaci zrozumiałej dla aplikacji OpenConnect przy pomocy polecenia:

openssl pkcs12 -in certyfikat.pfx -out certyfikat.cer -nodes

Aplikacja OpenConnect dostępna jest na firmware padavan dzięki repozytorium Entware. Po zainstalowaniu przy pomocy polecenia "opkg" uruchamiamy OpenConnect z następującymi parametrami:

/bin/echo "HASLO" | /opt/sbin/openconnect VPN_SERVER -i tun2 -c CERTYFIKAT.cer -u UZYTKOWNIK --passwd-on-stdin -l -b --servercert FINGERPRINT

gdzie odpowiednio zmieniamy poszczególne zmienne typu haslo, vpn_server, uzytkownik itp. Polecenie te możemy dodać do skryptów "autostart" w systemie. Musimy jeszcze zezwolić na dostęp naszej lokalnej sieci LAN do zdalnego VPN'a przy pomocy iptables:

/bin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o tun2 -j MASQUERADE

To wszystko - od teraz mamy dostęp do zdalnej sieci VPN bez potrzeby logowania się za każdym razem w aplikacji Cisco AnyConnect ;-)


Zauważyłem, że serwer VPN po określonym czasie (timeout) będzie próbował nas rozłączyć. Możemy się przed tym uchronić przy pomocy prostego skryptu, który będzie działał w tle na routerze.

while [ 1 ] ; do curl WEBSERVER ; sleep 60 ; done

Skrypt ten uruchomiony w pętli wykonuje zapytanie do webserwera w zdalnej sieci a następnie czeka minute na kolejne wywołanie. Tym sposobem nasze połączenie jest ciągle utrzymywane i nie występuje "timeout" po stronie serwera.


Nie ukrywam, że moją główna motywacją do całej tej konfiguracji był dostęp do sieci w której działa kontroler domeny - Active Directory. Jak wiadomo usługa AD opiera się w całości o DNS a więc musimy mieć możliwość odpytywania z naszej lokalnej sieci LAN zdalnego serwera DNS gdzie uruchomiona jest usługa AD.

Musimy skonfigurować nasz lokalny DNS w tym przypadku Dnsmasq aby przekazywał zapytania "domenowe" do określonego serwera przy pomocy takiego wpisu w pliku "dnsmasq.servers"

server=/domena/adres_serwera_DNS_VPN

w ten sposób określone zapytania do usługi kontrolera domeny będą prawidłowo rozwiązywane. Możemy teraz sprawdzić czy nasz komputer prawidłowo komunikuje się z kontrolerem domeny.

nltest /sc_query:domena
Flags: 30 HAS_IP  HAS_TIMESERV
Trusted DC Name \domena
Trusted DC Connection Status Status = 0 0x0 NERR_Success
The command completed successfully