OT: VPN pro Windows klienty

Dan Lukes dan at obluda.cz
Wed Mar 30 11:49:09 CEST 2011


On 03/30/11 10:38, kron24:
> - zatim nevim o jednoduchem navodu (ale Dan uz ho jednou psal,
> tak ho snad najdu)

Ja ho mezitim nasel ve svem archivu, sice asi nekde v hlubinach archivu 
teto konference lezi, snad se ael nestaen tolik, kdyz ho preposlu jeste 
jednou. Nezapomente ale, ze nize okopirovany text vznikl na pocatku jara 
roku 2002 pojednava o verzich OS ktere nekteri z vas mozna behem sve 
odborne kariery uz nestihli potkat.

Text jsem needitoval a tak tam zustala nabidka, z ebudu reagovat an 
doplnujici dotazy - nahlednete ale realisticky, ze s odstupem deviti let 
bude spise obtizne najit otazku, na kterou bych dokazal uspokojive 
odpovedet.

Dan

>     Informace se tykaji komunikace W2k resp FreeBSD versus FreeBSD, CISCO je zatim zcela neozkousene.
>
>     Takze - nezkonkurencne nejspolehlivejsi je IPSec bez key-managementu, FreeBSD proti FreeBSD, z pevne adresy na pevnou. To nema vubec zadne kontraindikace (krome nizsi bezpecnosti kvuli nevymenovanym klicum), je to spolehlive a i zatizeni CPU je male. Bohuzel, tato varianta neprichazi pro komunikaci s W2k vubec v uvahu (tam nelze klice staticky nastavit, alespon ne prostredky o kterych jsem kdy slysel).
>
>     Nicmene, pokud chceme dynamickou spravu klicu (tu potrebujeme pokud je jetna strana W2k), pak to uz je trochu jina.
>
>
>     Oproti dobam, kdy jsem jej naposled pouzival je stabilita prislusneho daemona (racoon) nekonecne lepsi. Nespadl mi ani jednou a klice vymenoval bez zavahani. Je pravda, ze v okamziku vymeny klicu se cas od casu par paketu komunikace ztrati, ale nenastava to vzdy a obvykle jde skutecne spise o jednotky paketu a doba vypadku je rozhodne pod zlomky vterin. Pokouseli jsme se ho ruzne trapit, dokonce jsme mu jinym programem z kernelu mazaly klice, ktere on tam pracne dotlacil a i z toho se (na strane odesilajici) dokaze pomerne slusne vzpamatovat (na strane prijimajici to nedokaze - a neni to ani mozne, na druhou stranu, to, ze mu nekdo v jadre vymaze klice asi nelze povazovat za "normalni"). Nicmene, nejsem zcela klidny - jednak v TODO je poznamka, ze je nutne vylepsit "rekeying" a rto jiste ma nejaky duvod (ackoliv me pripadalo, ze funguje dobre), jednak, problemy, ktere se tehdy ve FIO objevovaly mohly byt zpusobeny tim, ze komunikace probihala po saturovane az pretizene 
lince. To sice jsem schopen castecne simulovat, ale nemam poneti nakolik je takova simulace prukazna.
>
>     Zkratka receno, nepodarilo se mi racoona dostat do situace, o ktere se domnivam, ze by mohla realne nastavat a on by selhal - ale presto mu uplne neverim. Nicmene, asi bych to s nim zkusil.
>
>     Tak. A jake moznosti mame v tomto pripade. Autentizaci M$ Kerberosem vynechavam, protoze pro ni jsem na FreeBSD stranu nenasel zadny "protikus". Nenasel jsem ani zminku, ze by to nekdo pouzival.
>
>     Autentizace pomoci pre-shared-key - funguje jak ve variante F<->F tak W<->F, Windows by mely mit instalovany "high-encryption patch" (ten je normalne dostupny). ISAKMP protokol, ktery se na komunikaci pouziva definuje "main" a "agressive" mod navazovani spojeni - bohuzel, podle vsecho co jsem dokazal zjistit i vydisassemblovat, Windows umi pouze "main". To naprosto vylucuje (z principu designu protokolu) v tomto pripade variantu, ze by komunikace probihala mezi Windows s dynamickou adresou - obe strany musi navzajem sve adresy znat predem v konfiguraci.
>
>     Autentizace prostrednictvim X509 je jednoducha (tedy az na problem WIndows, jehoz reseni trvalo skoro 3 hodiny spocivajici v tom, ze databanky klicu jsou ve skutecnosti dve, o cemz se nikde nemluvi - a vsechny normalni utility umoznuji pracovat s osobnimi certifikaty v prvni bance, jenze pro ucely IPSec musi byt certifikat vlozen do te druhe). I tady plati, ze obe adresy musi byt pevne. A bohuzel, je zde jeste jedno omezeni, obe strany povazuji klic za autenticky pokud jej podepise pevne nakonfigurovana CA. To bohuzel prakticky znemoznuje revokovat konkretni klice (napr. pri odchodu zamestnance). Zde jeste neni zkoumani zcela dokonceno - je jiste, ze na strane BSD lze pomerne snadno zasahnout do konu a logiku "schvalovani" klice zmenit, na stane Windows to ale takhle nepujde - tam bych ale zase vsadil na moznost, ze WIndows by mohly, mozna, on-line kontaktovat nejakym protokolem CA a zjistovat zda aktualni klic je stale platny. Pokud to delaji, je jakz-takz vyhrano, pok
ud ne, je to spise neresitelne.
>
>
>     Co se tyce pripojeni a tunellingu stanic s nahodnou adresou, tam jsem pomerne skepticky. To co jsem zkousel, bylo "znasilnit" prostredky urcene pro staticke IP pro ucely IP dynamicke - coz se v zasade nepovedlo. Pro IPSec klice typu "mobileIP" ale neni v jadru FreeBSD vubec podpora.


> 	Pro ucely techto konfiguraci predpokladam, ze laskavy ctenar je alespon
> zakladne seznamem s principy IPSec a jeho implementaci na FreeBSD
> (protoze jinak je to na obrovsky dlouhe povidani), vi jaka je uloha
> racoon daemona v cele te veci, neni mu uplne neznamy pojem Oakley/ISAKMP
> (protokol pouzivany (nejen) Racoonem pro vymenu informaci), ma alespon
> zakladni prehled o problematice PKIX, X509 a tak podobne.
>
> 	Jsem pripraven reagovat na jakoukoliv doplnujici otazku; nejsem, ani po
> teto dobe, pripraven provest kompletni skoleni "od podlahy" ktere by
> nepredpokladalo zadne predchozi znalosti ze zminenych oboru.
>
> 	Tolik uvod. Zacneme.
>
> 	Jeste technicka poznamka - sice jsem svemu software zakazal zalamovat
> radky, ale stat se to, preci jen, muze - proto kazdy radek jest
> predchazen znakem '!'. Pokud radek timto znakem nezacina, je to nejspis
> zalomenina z radku predchoziho.
>
>
> [1]=== Tunnel FreeBSD vs FreeBSD, static, X509 ====================
>
> Nejprve tunnel FreeBSD versus FreeBSD na pevnych znamych IP adresach
> autentizovane X509 certifikaty. Tahle konfigurace je v zasade
> "normalni", tedy takova, kterou by clovek z examplu a navodu odvodil.
> Jediny hacek, na ktery lze narazit je, ze je nutne aby pouzity
> certifikat obsahoval polozku "X509v3 Subject Alternative Name" typu "IP"
> s tou IP adresou, ze ktere bude certifikat pouzivan. To mozna
> zkomplikuje pouzivani certifikatu podepsanych cizimi CA, protoze nelze
> obecne rict, zda CA extenze obsazene v requestu ponecha nebo odstrani.
> Jiny me znamy hacek tam neni.
>
> 	Takze:
>
> ---- ipsec.conf (pro setkey) ------------------------
> !flush;
> !spdflush;
> !spdadd 10.50.20.0/24 10.50.21.0/24 any -P out ipsec esp/tunnel/195.113.19.80-195.113.25.235/require;
> !spdadd 10.50.21.0/24 10.50.20.0/24 any -P in ipsec esp/tunnel/195.113.25.235-195.113.19.80/require;
> !spdadd 195.113.19.80/32 195.113.25.235/32 any -P out ipsec esp/transport/195.113.19.80-195.113.25.235/use;
> !spdadd 195.113.25.235/32 195.113.19.80/32 any -P in ipsec esp/transport/195.113.25.235-195.113.19.80/use;
> ---- ipsec.conf (pro setkey) - END ------------------
>
> Konfigurak plati pro obe strany - normalne by se "proti" delala
> konfigurace tak, ze by se zamenily IP adresy - jenze tady je vse totalne
> symetricke, takze by vyslo totez.
>
> ---- racoon.conf (pro racoon) ------------------------
> !path include "/usr/local/etc/racoon" ;
> !path certificate "/usr/local/etc/racoon" ;
> !padding
> !{
> !        maximum_length 20;      # maximum padding length.
> !        randomize off;          # enable randomize length.
> !        strict_check off;       # enable strict check.
> !        exclusive_tail off;     # extract last one octet.
> !}
> !timer
> !{
> !        counter 5;              # maximum trying count to send.
> !        interval 20 sec;        # maximum interval to resend.
> !        persend 1;              # the number of packets per a send.
> !        phase1 30 sec;
> !        phase2 15 sec;
> !}
> !remote 195.113.25.235
> !{
> !        exchange_mode aggressive,main;
> !        doi ipsec_doi;
> !        situation identity_only;
> !        my_identifier address;
> !        certificate_type x509 "dz.pem" "dzk.pem";
> !        nonce_size 16;
> !        lifetime time 5 min;    # sec,min,hour
> !        initial_contact on;
> !        proposal_check obey;    # obey, strict or claim
> !        proposal {
> !                encryption_algorithm 3des;
> !                hash_algorithm sha1;
> !                authentication_method rsasig ;
> !                dh_group 2 ;
> !        }
> !}
> !sainfo address 195.113.19.80 any address 195.113.25.235 any
> !{
> !        pfs_group 1;
> !        lifetime time 30 sec;
> !        encryption_algorithm 3des ;
> !        authentication_algorithm hmac_md5;
> !        compression_algorithm deflate ;
> !}
> !sainfo address 10.50.20.0/24 any address 10.50.21.0/24 any
> !{
> !        pfs_group 1;
> !        lifetime time 5 min;
> !        encryption_algorithm 3des ;
> !        authentication_algorithm hmac_md5;
> !        compression_algorithm deflate ;
> !}
> ---- racoon.conf (pro racoon) - END ------------------
>
> 	Konfigurace pro protistranu se udela tak, ze se prohodi IP adresy.
>
> 	Parametr certificate_type specifikuje jmeno souboru s certifikatem a
> jmeno souboru s klicem. Na *protejsi strane* pak musi byt v adresari
> [path certificate] klic certifikacni autority, ktera jej podepsala.
> Jmeno souboru v tomto adresari je v obvyklem OpenSSL formatu, takze
> <hash>.0 kde hash zjistime volanim x509 s parametrem -hash.
>
> [2]=== Tunnel FreeBSD vs Windows 2000, dynamic, X509 ===============
>
> 	Ten realizovae neumim primo, pouze jako variantu "TRANSPORT FreeBSD vs
> Windows 2000, dynamic, X509" a skrz takto ustavene IPSec spojeni pak
> protlacim PPTP, ktere fakticky vytvari tunnel.
>
> [3]=== Transport FreeBSD vs Windows 2000, dynamic, X509 ============
>
> 	Na strane Windows predpokladam nikoli Basic W2k, ale W2k se vsemi
> dostupnymi patchy. Je mozne, ze nejsou potrebne vsechny, ale neoveroval
> jsem minimalni seznam nutnych. Jiste je, ze urcite musi byt instalovany
> High Encryption Patch a pravdepodobne i SP2. Instalovany musi byt take
> Client Microsoft Network, nemusi vsak byt bindnuty k zadne sitove karte
> a prislusny service muze byt disabled.
>
> ---- ipsec.conf (pro setkey, strana FreeBSD) --------
> !flush;
> !spdflush;
> ---- ipsec.conf (pro setkey) - END ------------------
>
> ---- racoon.conf (pro racoon, strana FreeBSD) -------
> !path include "/usr/local/etc/racoon" ;
> !path certificate "/usr/local/etc/racoon" ;
> !padding
> !{
> !        maximum_length 20;      # maximum padding length.
> !        randomize off;          # enable randomize length.
> !        strict_check off;       # enable strict check.
> !        exclusive_tail off;     # extract last one octet.
> !}
> !timer
> !{
> !        counter 5;              # maximum trying count to send.
> !        interval 20 sec;        # maximum interval to resend.
> !        persend 1;              # the number of packets per a send.
> !        phase1 30 sec;
> !        phase2 15 sec;
> !}
> !remote anonymous
> !{
> !        exchange_mode main,aggressive;
> !        doi ipsec_doi;
> !        my_identifier address;
> !        certificate_type x509 "dz.pem" "dzk.pem";
> !        generate_policy on;
> !        nonce_size 16;
> !        lifetime time 1 min;    # sec,min,hour
> !        initial_contact on;
> !        support_mip6 on;
> !        proposal_check obey;    # obey, strict or claim
> !
> !        proposal {
> !                encryption_algorithm 3des;
> !                hash_algorithm md5;
> !                authentication_method rsasig ;
> !                dh_group 2 ;
> !        }
> !}
> !
> !sainfo anonymous
> !{
> !        pfs_group 1;
> !        lifetime time 30 sec;
> !        encryption_algorithm 3des,des,cast128,blowfish ;
> !        authentication_algorithm hmac_sha1, hmac_md5;
> !        compression_algorithm deflate ;
> !}
> ---- racoon.conf (pro racoon) - END ------------------
>
> Konfigurace Windows neni zdaleka tak pekne vysvetlitelna.
>
> Spustite mmc.exe.
>
> Console->[Add/Remove Snap In]->Add
> Vyberete [IP Security Policy Manager] a [Certificates] (V obou pripadech
> Local Computer, u Certifikatu je jeste jedna volba, spravna je "Computer
> Account").
> [OK] az do zakladniho menu MMC.
>
> Do "Console Root\Certificates (Local Computer)\Trusted Root
> Certification Authorities\Certificates" date certifikaty certifikacnich
> autorit klicu obou stran (pridava se pres prave tlacitko, "All
> tasks->Import"), samozrejme, pokud vydala oba klice jedna autorita,
> staci jen jednou.
>
> Do "Console Root\Certificates (Local Computer)\Personal\Certificates"
> date certifikat a klic generovany pro tuto stanici. Pro jistotu overite,
> ze status pridaneho certifikatu je "OK"
>
> Tim by mely byt certifikaty hotovy.
>
> Jste je ale nutne vyrobit Polici - takze [IP Security Policy Manager], New (pravym tlacitkem), nejak ji pojmenovat NEMIT zasktnuti "Activate the default response rule", zato zaskrtnout "Edit properties". Zalozku [General] nechat zcela byt, vytvorit novou IP Security Rule (tlacitko Add). THIS RULE DOES NOT SPECIFY A TUNNEL, [All Network Connections], Use a Certificate from this Certificate Authority a Browse (najit Certifikat te CA, ktera podepsala klic PROTEJSIHO stroje). Jsme v IP FILTER LISTS. Zde [Add], znovu [Add], SOurce Address je "My address", Destination je "specific DNS address" nebo "specific IP address", protocol je Any, a mame [Finish] a po nem [Close]. Jsme zpet v "IP filter lists", kde zaskrtneme prave vyvoreny a [Next], "Require security" (NOT Optional!) a [Next] a [Finish] a [Close]. Jsme zpet v MMC. Pravym tlacitkem na prave vytvorene Polici a aktivovat "Assign". Od teto chvile by to melo, teoreticky, fungovat. Muzete zkusit spustit
> IPsecmon, zda je navazana konexe. Podotykam, ze ta se navazuje "on demand", takze nejprve je nutne vyvolat nejakou komunikaci s druhym koncem (pozor, primo s druhym koncem - to co mame NENI tunnel).
>
> ------------------------------------------
>
> 	Tak, a ted kdyz mame IPSec, muzeme pres nej prohnat tunnel.
>
>
> 	Na strane FreeBSD je nutne nainstalovat mpd
>
> ---- mpd.conf (pro mpd, strana FreeBSD) -------
> !default:
> !        load pptp0
> !        load pptp1
> !#       load debug
> !
> !# PPTP Server
> !debug:
> !        log ecp ecp2 ccp ccp2 ccp3
> !
> !pptp0:
> !        new -i ng0 pptp0 pptp0
> !        set bundle disable multilink
> !        set bundle enable compression
> !        set bundle enable encryption
> !        set iface disable on-demand
> !        set iface enable proxy-arp
> !        set iface idle 0
> !        set ipcp ranges 192.168.3.1/32 192.168.3.2/32
> !        set ipcp dns 192.168.1.1
> !        set link disable pap
> !        set link enable chap
> !        set link keep-alive 10 60
> !        set ccp enable mppc
> !        set ccp yes mppc
> !        set ccp disable mpp-compress
> !        set ccp no mpp-compress
> !        set ccp disable mpp-e40
> !        set ccp yes mpp-e128
> !        set ccp enable mpp-e128
> !        set ccp enable mpp-stateless
> !        set ccp yes mpp-stateless
> !
> !pptp1:
> !        new -i ng1 pptp1 pptp1
> !
> !        set bundle disable multilink
> !        set bundle enable compression
> !        set bundle enable encryption
> !        set iface disable on-demand
> !        set iface enable proxy-arp
> !        set iface idle 0
> !        set ipcp ranges 192.168.3.5/32 192.168.3.6/32
> !        set ipcp dns 192.168.1.1
> !        set link enable acfcomp protocomp
> !        set link disable pap
> !        set link enable chap
> !        set link keep-alive 10 60
> !        set ccp enable mppc
> !        set ccp yes mppc
> !        set ccp disable mpp-compress
> !        set ccp no mpp-compress
> !        set ccp disable mpp-e40
> !        set ccp yes mpp-e128
> !        set ccp enable mpp-e128
> !        set ccp enable mpp-stateless
> !        set ccp yes mpp-stateless
> ---- mpd.conf (pro mpd, strana FreeBSD) - END -
>
> ---- mpd.links (pro mpd, strana FreeBSD) -------
> !pptp1:
> !        set link type pptp
> !        set pptp self 62.65.158.74
> !        set pptp enable incoming
> !        set pptp disable originate
> !pptp1:
> !        set link type pptp
> !        set pptp self 62.65.158.74
> !        set pptp enable incoming
> !        set pptp disable originate
> ---- mpd.links (pro mpd, strana FreeBSD) - END -
>
> ---- mpd.secret (pro mpd, strana FreeBSD) -------
> !joe             "foobar"        192.168.1.1
> !bob             "\x34\"foo\n"   192.168.1.10/24
> !sal             "yipee"         192.168.1.254
> ---- mpd.secret (pro mpd, strana FreeBSD) - END -
>
>
> 	To je konfigurace mpd umoznujici soucasne pripojeni nejvyse dvou uzivatelu. Pro vice uzivatelu si to jiste dokazete uz rozsirit sami. V jadre musi byt pritomen modul "netgraph", zvlastni upozorneni, z klienta musi na server dojit IP pakety typu 47 (GRE, Generic Routing Encapsulation).
>
> 	Na strane Windows predpokladam nikoli Basic W2k, ale W2k se vsemi
> dostupnymi patchy. Je mozne, ze nejsou potrebne vsechny, ale neoveroval
> jsem minimalni seznam nutnych. Jiste je, ze urcite musi byt instalovany
> High Encryption Patch a pravdepodobne i SP2. Instalovany musi byt take
> Client Microsoft Network, nemusi vsak byt bindnuty k zadne sitove karte
> a prislusny service muze byt disabled.
>
> 	Na Windowsech se [Start]->[Settings]->[Network COnnections]->[Make New Connection] zahaji vytvareni VPN. Spravna polozka je "Connect to a private network throught Internet". IP adresa je ta protistrany, dalsi polozku si vyberete podle pozadavku a tim je hotovo.
>
> 	Pri pripojeni je nutne zadat jmeno a heslo, vetsi uspech lze dosahnotu pokud pouzite jmeno a heslo je totozne s parem uvedenym v mpd.secret
>
> 	Tato konfigurace aktivuje i kryptovani v ramci PPTP tunelu - takze sifrovany tunnel je honen sifrovanym transportnim kanalem IPSecu - to je mozne zbytecne a ma to dopad na vykon, i kdyz aj nic nepoznal (ale zase je to paranoidni) - sifrovani tunelu lze zmenou mpd.conf zakazat.
>
> 	Pri prvnim pripojovani je nutne vlezt do [Properties], zalozka [Security], vybrat "Advanced" a [Settings]. Data Encryption = "Maximum strength ..." , Logon security - Allow these protocols: MS-CHAP, MSCHAP v2. [OK], [OK], vyplnit jmeno a heslo a dial..
>
> ------------------------------------------------------------------
>
>
> 	Z praktickych duvodu doporucuji rozchodit obe nezavisle veci nezavisle - tj nejprve IPsec transport bez tunelu a pak tunel bez IPsecu a pak teprve oboji.
>
> 	Logovani IPsec na strane Windows se zapne v registry:
>
> [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\PolicyAgent\Oakley]
> "EnableLogging"=dword:00000001
> "Debug"=dword:000000ff
>
> 	log se vytvari v %SystemRoot%\debug\oakley.log - ale format neni nikde popsany, takze je nutna intuice a znalost ISAKMP protokolu.
>
> 	O moznosti logovani PPTP tunelu na strane Windows nic nevim.
>
> 	Hodne stesti a pripadne se zeptejte. Predem ale upozornuju, ze nemusim byt schopen na dalku problem vyresit, zejmena v pripade, kdy se to proste za stejne situace na stejny pokyn zachova jinak nez jak se to chova me tady.
>
> 							Dan
>
>
> ====================================================================


More information about the Users-l mailing list