Juniper VPN a Linux

Nedávno se mi dostal do ruky box Juniper SA2500. Ten kromě Web SSL VPN a dalších vychytávek umožňuje i klasickou VPN, tedy na klientské části vytvoření virtuálního interfacu a tunelování. Network connect (aplikace pro vytvoření tunelu) je dostupná i pro Linux, avšak pouze 32bit a podporována je pouze distribuce Red Hat.

Pro sebe jsem však potřeboval VPNku rozchodit na Ubuntu a ještě k tomu 64bit. Na distribuci víceméně nezáleží - stačí jenom pokud je počítač schopný rozbalit RPM balíček. Trochu větší kompikace pak nastanou s rozdílnou architekturou. Nejprve jsem našel tento článek. Podle popisu zde to docela dobře funguje - při prvním spuštění NC z webu se stáhne klientská app a pak ji stačí už spouštět jenom poskytnutým skriptem (případně ji pouštět přímo s potřebnými parametry). Nicméně tento postup funguje pouze s jednou autorizací. SA VPNky umožňují i více autorizačních procesů a zrovna v mém případě jsem pro login potřeboval heslo + certifikát uložený v USB tokenu. A zde nastává komplikace - NC puštěnému lokálně pomocí parametrů nevnutíte ani druhé heslo, natož spolupráci s tokenem.

Pokud se NC spustí přímo z webu, nejsou potřeba už žádné další údaje. Původně jsem zkoušel tedy počítač donutit, aby se NC spustilo přímo z prohlížeče, to se ovšem nepovedlo. Nicméně jsem narazil na další článek. Při úspěšném vyhlášení do VPN se vygeneruje nějaký identifikátor, který si prohlížeč uloží do cookies (cookie s jménem DSID). Pokud se tedy NC při spuštění podaří vnutit používání této cookie, nemusí se již autorizovat a tedy pokud přes prohlížeč projdeme úspěšně všemi autorizacemi a vnutíme NC vytvořenou cookie, mělo by to fungovat. Další výhodou tohoto řešení je, že puštění NC na linuxu s parametry nepodporuje host checker a pokud tedy na boxu jsou nastavené host checky (na Windows kontroly na antiviry apod.), NC se nepřipojí. V tomto případě NC tento krok také přeskočí a bude to fungovat.

Postup, jak spouštět NC s parametrem i pro cookie je ve druhém článku. Ve zkratce je potřeba učinit knihovnu, která se při instalaci NS stáhne, spustitelnou a tu pak vhodně spustit. Tedy:

  1. nainstalovat gcc-multilib
  2. přeložit libncui.so: gcc -m32 -o -Wl,rpath=`pwd` -o ncui libncui.so
  3. uložit si certifikát VPN serveru v DER formátu
  4. spustit ncui -h hostname_vpn_serveru -f cesta_k_certifikátu -c DSID=id_z_cookie_v_prohlížeči

Program ncui vůbec nic nevypisuje, ale pokud v ifconfig je vidět nové tun zařízení a přes síť komunikuje, skončilo vše dobře a máte funkční VPN. Jen tento postup je pořád ještě takový nedokonalý - kdo si má pamatovat 150 parametrů a ještě kopírovat cosi někde z prohlížeče. Pokusil jsem se tedy připojení automatizovat. Původně jsem se snažil přečíst přímo uložené cookies; domníval jsem se, že je to SQLite databáze, nicméně ten soubor v profilu Firefoxu se mi nechtěl nějak otevřít. Nicméně pro Firefox jsem našel ještě jedno řešení - rozšíření Cookie Exporter umožňuje vyexportovat cookies do textového souboru. Řekněme tedy, že ncui je /home/user/.juniper_networks/network_connect/ncui, v téže složce je ssl.crt (DER certifikát), do /home/user/cookies.txt budeme ukládat cookies z prohlížeče a připojujeme se na vpn.server.com. V .bashrc si tedy vytvoříme alias; přidáme toto:
alias vpnwork="/home/user/.juniper_networks/network_connect/ncui -h vpn.server.com -c DSID=`cat /home/user/cookies.txt|grep vpn.server.com|grep DSID|cut -f7|tr -d '\r'` -f /home/user/.juniper_networks/network_connect/ssl.crt"
.bashrc uložíme a spustíme nový shell. Firefoxem se přihlásíme do VPNky a v menu nástroje vybereme Export cookies a uložíme do ~/cookies.txt. Následně po zadání vpnwork v novém terminálu by se měla VPNka spustit. Tradá :-)