VPN [LINUX/*BSD] <-> Windows NT/2K/XP     HOWTO


Celem niniejszego HOWTO jest podanie dzia�aj�cego przyk�adu VPNa mi�dzy bram� postawion� na linuxie (wzgl. BSD), a klientem Windowsowym.
Problem do rozwi�zania: coraz wi�ksza liczba 'zdalnych pracownik�w' musi mie� dost�p z zewn�trz do coraz wi�kszej ilo�ci danych firmowych - znajduj�cych si� na lokalnych serwerach w firmie. Po�o�enie jak i adres IP pracownik�w jest nieznany, cz�sto ��cz� si� zza jakiej� maskarady w sieci osiedlowej czy z innych podejrzanych miejsc.

Dobrym rozwi�zaniem powy�szego problemu jest zestawienie po��czenia VPN mi�dzy klientem, a routerem firmowym (bramk� VPN). Po��czenie to zapewnia szyfrowany tunel z sieci� wewn�trzn� firmy, dzi�ki czemu aplikacje klienckie b�d� mog�y pracowa� tak, jakby osoba by�a fizycznie w firmie. Ca�y ruch warstwy transportowej (aplikacji klienckich) jest enkapsulowany (opakowywany "warstw� ochronn�") i przez internet "leci" w postaci pakiet�w UDP. Po stronie bramy VPN nast�puje proces odwrotny - dekapsulacja, czyli zdejmowanie warstwy na�o�onej w procesie tunelowania. Pokazuje to za��czony schemat.

Tyle teorii, w praktyce dzi�ki enkapsulacji mo�na przez internet przes�a� protoko�y nierutowalne (np. IPX*, NetBEUI itp), a co najwa�niejsze w spos�b bezpieczny

OpenVPN - openvpn.sourceforge.net

Zdecydowa�em si� na wyb�r pakietu OpenVPN, gdy� jego instalacja nie jest trudna, a mo�liwo�ci ca�kiem dobre. Co najwa�niejsze, pakiet dzia�a te� pod systemami Windows, niestety w chwili pisania tego tekstu (grudzien 2003), s� wersje tylko pod NT4/2K/XP. By� mo�e niebawem wyjd� wersje pod Win9x/Me

Instalacja - Linux/BSD:

	    1) sci�gnij najnowsze �r�d�a stabilnej wersji. Uwaga - program 
	    spakowany jest jakim� kosmicznych gzipem. Wstyd si� przyzna�,
	    ale ja to rozpakowa�em pod Windows Commanderem, nast�pnie 
	    spakowa�em do 'zwyk�ego' tgz i przes�a�em na serwer :)
	    2) ./configre && make && make install
	    Pod linuxem mo�na doda� te� opcj� --enable-pthread, bo jak pisz�:
	    --enable-pthread        Compile pthread support for improved SSL/TLS latency
	    je�li nie masz biblioteki LZO, to musisz wy��czy� obs�ug� 
	    kompresji  --disable-lzo, ale lepiej j� doinstalowa�:
	    http://www.oberhumer.com/opensource/lzo/
	    Za�o�y�em tutaj, �e u�ywasz linuxa na kernelu 2.4, w przeciwnym
	    razie musisz poczyta� dok�adnie proces instalacji na kernelu 2.2
	    (na stronie g��wnej projektu).
	    Oczywi�cie musi by� te� zainstalowany OpenSSL, ale to chyba ka�dy ma.
	

Konfiguracja:

	    Pierwsz� rzecz� na jak� musimy si� zdecydowa�, to spos�b autoryzacji. S� tutaj dwa rozwi�zania:
	    1 - prostsze - wsp�dzielony klucz (Pre-Shared Key)
	    2 - trudniejsze - rozwi�zanie oparte o SSL/TLS - certyfikaty i klucze RSA
	
Rozwi�zanie oparte o wsp�dzielony klucz

Musisz wygenerowa� klucz i umie�ci� go po obu stronach tunelu (na bramie i u klineta/�w). �atwo si� domy�le� co si� stanie gdy kt�remu� z pracownik�w zginie laptop... generujemy: openvpn --genkey --secret static.key Dalej musisz przegra� (w spos�b bezpieczny :) ten klucz na laptopa zdalnego pracownika.
Je�li wystarczy Ci rozwi�zanie oparte o klucz wsp�dzielony - mo�esz przeskoczy� od razu do dzia�u konfiguracja OpenVPN

Rozwi�zanie oparte o certyfikaty

Tutaj jest ostra jazda dla os�b nieznaj�cych tematki SSL, dlatego w�a�nie postanowi�em napisa� to HOWTO :)
Je�li znasz dobrze tematyk� SSL albo preferujesz rozwi�zanie oparte o klucz wsp�dzielony - mo�esz opu�ci� poni�sze wypociny dotycz�ce certyfikat�w i przekoczy� od razu do dzia�u konfiguracja OpenVPN

Musimy wyr�ni� nast�puj�ce poj�cia:

Zak�adam, �e wystawc� certyfikatu chcesz by� Ty sam (w komercyjnych rozwi�zaniach trzeba da� sobie podpisa� certyfikat przez "zaufanego" wystawc� - np. Thawte, dzi�ki czemu inni b�d� mieli pewno��, �e Ty to naprawd� Ty :) (ma to wi�ksze znaczenie dla certyfikat�w wystawianych dla serwer�w WWW)

przygotowanie OpenSSL

znajd� plik openssl.cnf - b�dzie on albo w /etc/ssl/ - je�li masz OpenSSL'a instalowanego razem z dystrybucj� (Slack tak ma), albo gdzie� /usr/local, je�li kompilowa�e� OpenSSLa sam.
Nale�y poda� w�a�ciwy katalog dla zmiennej dir. Ja za�o�y�em sobie katalog /keys i tam OpenSSL przygotowuje mi wszystkie pliki:
	    [ CA_default ]

	    dir             = /keys                 # Where everything is kept
	    certs           = $dir/certs            # Where the issued certs are kept
	    crl_dir         = $dir/crl              # Where the issued crl are kept
	    database        = $dir/index.txt        # database index file.
	    new_certs_dir   = $dir/newcerts         # default place for new certs.

	    certificate     = $dir/cacert.pem       # The CA certificate
	    serial          = $dir/serial           # The current serial number
	    crl             = $dir/crl.pem          # The current CRL
	    private_key     = $dir/private/cakey.pem# The private key
	    RANDFILE        = $dir/private/.rand    # private random number file
	
Wa�nym jest �eby� za�o�y� w swoim katalog $dir (u mnie /keys) podkatalogi crl/   private/  certs/  newcerts/  oraz stworzy� nast�puj�ce pliki:
	    touch /keys/index.txt
	    echo 00 > /keys/serial
	
Mo�esz te� w openssl.cnf przypisa� domy�lne warto�ci zmiennych, o kt�re pyta OpenSSL podczas generowania certyfikat�w, zaoszcz�dzisz p�niej troch� czasu (nie musz�c wpisywa� kilka razy tego samego). W tym celu na ko�cu pliku odszukaj zmiennych _default:

	    [ req_distinguished_name ]
	    countryName                     = Country Name (2 letter code)
	    countryName_default             = PL      
	    stateOrProvinceName             = State or Province Name (full name)
	    stateOrProvinceName_default     = Poland
	    localityName                    = Locality Name (eg, city)
	    localityName_default            = Gliwice
	

generacja kluczy

generujemy klucz prywatny wystawcy certyfikatu cakey.pem

	    openssl genrsa -des3 -out private/cakey.pem 1024
	
Nale�y tu poda� has�o - b�dzie nam p�niej potrzebne przy wystawianiu certyfikatow innym jednostkom.
Teraz generujemy certyfikat wystawcy - czyli certyfikat Root CA, zeby za rok si� nie denerwowa�, dajmy od razu ze 5 lat wa�no�ci:
	    openssl req -new -x509 -days 1825 -key private/cakey.pem -out cacert.pem
	
Jako has�o podajemy nasze hase�ko klucza prywatnego Root CA. Openssl zapyta o r�ne dziwne rzeczy - najlepiej podawa� zgodnie z pytaniami. Na pytanie 'Common Name' - podaj nazw� firmy lub jaki� dowolny ci�g znak�w. Na pytanie o e-mail te� nie musisz podawa� swojego prawdziwego...

generujemy klucz i certyfikat dla bramy VPN:

	    openssl genrsa -des3 -out private/gwkey.pem 1024
	
Problem z has�em dla klucza bramy polega na tym, �e przed ka�dym zestawieniem tunela trzeba b�dzie poda� has�o (po stronie bramy !, a nie da si� go pobra� z pliku, przynajmniej nie widz� takiej opcji). Je�li chcesz unikn�� pytania, to mo�esz �ci�gn�� has�o z klucza. Zrobimy to jednak na samym ko�cu

Dalej tworzymy wniosek (do Root CA) o wydanie nam certyfikatu:

	    openssl req -new -key private/gwkey.pem -out gwreq.pem
	
Potwierdzamy has�em klucza prywatnego BRAMY
W pytaniu o 'Common Name' mo�esz poda� nazw� firmy albo inn� swoj� nazw�. B�dzie tam te� pytanie o jakie� dodatkowe atrybuty -- zostawiamy puste.

Teraz jako Root CA wydajemy bramie certyfikat:

	    openssl ca -notext -in gwreq.pem -out gwcert.pem
	    {tutaj podajemy has�o klucza prywatnego Root CA - te pierwsze has�o w og�le)
	

Z wa�nych plik�w mamy ju�:

Czyli brakuje nam jeszcze klucza prywatnego usera i podpisanego dla niego (przez CA) certyfikatu (kr�tko userkey.pem i usercert.pem).
Procedura jest dok�adnie taka sama jak dla bramy VPN. Nie �ci�ga�bym jednak p�niej has�a z kluczy user�w - nawet w przypadku utraty komputera, do zestawieniem tunela trzeba jeszcze b�dzie poda� has�o (has�o klucza prywatnego usera).
	    generujemy klucz prywatny usera:
	    openssl genrsa -des3 -out private/userkey.pem 1024
	    
	    dalej wystawiamy wniosek o wydanie certyfikatu:
	    openssl req -new -key private/userkey.pem -out userreq.pem
	    (teraz nale�y poda� has�o klucza prywatnego usera - te powy�sze)

	    nast�pnie maj�c przygotowany wniosek (userreq.pem) podpisujemy go jako CA:
	    openssl ca -notext -in userreq.pem -out usercert.pem

	    (teraz nale�y poda� oczywi�cie has�o klucza wystawcy CA - czyli to pierwsze hase�ko w og�le)
	    Mo�na rozwa�y� opcj� skr�cenia czasu wa�no�ci kluczy user�w do np. kilku miesi�cy 
	    (ustawia to prze��cznik enddate przy podpisie przez CA - format YYMMDDHHMMSSZ)
	
	    Wa�no�� certyfikatu (validity) mo�emy zawsze sprawdzi� poleceniem:
	    openssl x509 -noout -text -in user.crt
	

Huh mamy ju� wszystkie potrzebne pliki:

	    cakey.pem , cacert.pem , gwkey.pem , gwcert.pem , userkey.pem , usercert.pem
	
Teraz mo�emy �ci�gn�� has�o z klucza bramy:
	    openssl rsa -in private/gwkey.pem -out private/gwkey.pem_bezhasla
	    oczywi�cie operacja si� uda tylko pod warunkiem podania poprawnego has�a dla gwkey.pem
	
Tak naprawd� cakey.pem jest potrzebny tylko do podpisywania nowych wniosk�w. Do samego dzia�ania tunela nie jest on potrzebny.
Pliki *req.pem (wnioski) mo�esz skasowa� - nie s� ju� potrzebne.



KONFIGURACJA OpenVPN

Zasadniczo OpenVPN mo�e dzia�a� w dw�ch trybach: Jak �atwo si� domy�le� r�nica polega w tym co przekazywane jest przez zestawiony tunel. W trybie bridga "leci" wszystko - ��cznie z broadcastami. Dla aplikacji warstw wy�szych tunel jest zupe�nie prze�roczysty. Nadaje si� do transportowania IPX-a po IP. Do wad nale�y oczywi�cie znacznie wi�kszy ruch - w zale�no�ci od wielko�ci sieci firmowej, broadcasty potrafi� zatka� s�abe po��czenie PPP.
W trybie routera 'dev tun' zestawiony kana� dzia�a jak normalny router. Zestawiane jest po��czenie punkt-punkt (na wirtualnych interfejsach tun) i w celu dost�pu do zdalnej sieci nale�y ustawi� odpowiednio tras� routingu:
	    route add siec_firmowa MASKA gw ip_virtualne_bramy_vpn
	
Wydajniejsze jest oczywi�cie po��czenie typu router, niemniej w niekt�rych przypadkach korzystniejsze mo�e okaza� si� bridgowanie.

router - czyli dev tun
po pierwsze sprawd� czy masz za��czony forwardnig, bo przez t� drobnostk� mo�na straci� du�o czasu:

	    echo 1 > /proc/sys/net/ipv4/ip_forward
	
nast�pnie za�aduj driver obs�ugi tunela:
	    modprobe tun
	
Na pocz�tek konfiguracja przy u�yciu wsp�dzielonego klucza:

Przygotowujemy konfiga np. w /etc/openvpn/config-router
Przyk�adowa klasa IP 10.3.0.0/24 dla potrzeb tunelu mo�e by� oczywi�cie inna. Je�li po drugiej stronie istnieje sie� o takiej puli adresowej to z ca�� pewno�ci� musisz wykorzysta� inn� pul� na potrzeby tunelu.

	    # przyk�adowa konfiguracja przy u�yciu klucza wsp�dzielonego
	    # plik konfiguracyjny po stronie bramy VPN
	    # Brak warto�ci remote oznacza, �e dopuszczamy ka�dy IP po drugiej stronie
	    dev tun
	    tun-mtu 1500
	    # ifconfig local_ip remote_ip
	    ifconfig 10.3.0.1 10.3.0.2
	    ; port 5000
	      user nobody
	      group nobody
	      comp-lzo
	      
	      ; ping 15
	      ; ping-restart 45
	      ; ping-timer-rem
	      ; persist-tun
	      ; persist-key
	    
	       verb 3
	       secret /etc/openvpn/secret.key
	       ; eof
	   
Po stronie klienta plik wygl�da nast�puj�co:
	    dev tun
	    tun-mtu 1500
	    remote 157.158.1.3  // faktyczny IP bramy VPN !
	    # ifconfig local_ip remote_ip
	    ifconfig 10.3.0.2 10.3.0.1    // uwaga - odwrotnie ni� po stronie Bramy !
	    ; port 5000
	      user nobody
	      group nobody
	      comp-lzo
	      
	      ; ping 15
	      ; ping-restart 45
	      ; ping-timer-rem
	      ; persist-tun
	      ; persist-key
	    
	       verb 3
	       secret c:\progra~1\openvpn\config\secret.key
	       ; eof
	   
Oczywi�cie dost�p do pliku klucza powinien mie� tylko root. Opcje 'ping' s� u�ywane w celu sprawdzenia czy 'druga strona' jeszcze "�yje" - przydatne w przypadku gdy klient cz�sto ��czy si� na chwil� i roz��cza (laptopowcy).

konfiguracja oparta o certyfikaty

Tutaj nale�y wyr�ni� serwera i klienta. Za�o�y�em �e serwerem b�dzie brama VPN po stronie firmy. Przed przyst�pieniem do edycji konfiga musimy wygenerowa� jeszcze jeden plik (Diffie Hellman parameters)
	       openssl dhparam -out dh1024.pem 1024
	   
Maj�c ju� wszystkie pliki kluczy kopiujemy do jednego podkatalogu np. /etc/openvpn/certs/ i przyst�pujemy do edycji konfiga:
	       # przyk�adowa konfiguracja przy u�yciu certyfikat�w. Zwr�c uwag�
	       # odr�nienie klienta i serwera.
	       # plik konfiguracyjny serwera (bramy VPN)
	       dev tun
	       tun-mtu 1500
	       ifconfig 10.3.0.1 10.3.0.2

	       ; port 5000

		user nobody
		group nobody

	       comp-lzo

		  ; ping 15

		  ; ping 15
		  ; ping-restart 45
		  ; ping-timer-rem
		  ; persist-tun
		  ; persist-key

		verb 4
		tls-server
		dh /etc/openvpn/certs/dh1024.pem
		
		# certyfikat wystawcy (CA)
		ca /etc/openvpn/certs/cacert.pem

		# certyfikat bramy
		cert /etc/openvpn/certs/gwcert.pem

		# klucz prywatny bramy 
		key /etc/openvpn/certs/gwkey.pem
		# lub /etc/openvpn/certs/gwkey.pem_bezhasla
		;eof
	    
Konfiguracja po stronie klienta wygl�da nast�puj�co:
		remote IP_SERWERA_VPN   # faktyczne "zewn�trzne" IP Internetowe Bramy VPN
		port 5000
		dev tun
		tun-mtu 1500
		ifconfig 10.3.0.2 10.3.0.1

		tls-client

		 Certificate Authority file
		 ca c:\progra~1\openvpn\config\cacert.pem
		
		 # Our certificate/public key
		 cert c:\progra~1\openvpn\config\usercert.pem
		
		 # Our private key
		 key c:\progra~1\openvpn\config\userkey.pem
		
		 ; ping-restart 60
		 ; ping-timer-rem
		 ; persist-tun
		 ; persist-key
		 ; resolv-retry 86400
		
		# # keep-alive ping
		ping 10
		
		# # enable LZO compression
		comp-lzo
		verb 4
		; eof
	    
uruchomienie tunelu
Jako pierwsze sprawd�, czy klient potrafi "pingn��" internetowe (zewn�trzne) IP bramy z kt�r� ma si� ��czy�. Je�li nie potrafi, dalej nawet nie pr�buj do czasu a� nie b�dzie poprawnej komunikacji przed tunelem - ja przez to straci�em 20 minut :(
uruchomienie jest banalnie proste:
		openvpn --config /etc/openvpn/config...
	    
Po stronie windowsa albo j.w. z lini komend, albo prawym klawiszem myszy kliknij na pliku konfiguracyjnym i z menu wybierz 'Start OpenVPN on this config file'
Obserwuj komunikaty, cz�stym b��dem jest liter�wka w �cie�ce do certyfikat�w. Je�li tunel si� postawi powinno si� da� pingn�� przeciwn� stron�, czyli po stronie Windowsa powinno da� si� pingn�� IP 10.3.0.1 - je�li tak, to wszystko dzia�a OK ! �eby teraz m�c dosta� si� do komputer�w w sieci wewn�trznej po drugiej stronie bramy VPN trzeba doda� trase routingu. Zak�adaj�c, �e sie� firmowa to pula 10.0.0.0/24 nale�y wpisa�:
		; sk�adnia unixowa
		route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.3.0.1
		; sk�adnia windowsowa
		route add 10.0.0.0 mask 255.255.255.0 10.3.0.1
	    
Po wpisaniu powy�szego powinno da� si� pingowa� komputery w sieci wewn�trznej firmy (np. 10.0.0.5)
�eby przy ka�dym zestawianiu tunela nie wpisywa� r�cznie routingu da si� doda� to polecenie do samego konfiga

bridgowanie
Nie dam ju� rady opisa� dok�adnie konfiguracji dla bridge'a, ale jest ona doskonale napisana na stronie g��wnej projektu. Napisz� tylko w skr�cie jak to dzia�a:
		`which brctl` addbr br0
		`which brctl` addif br0 eth1
		`which brctl` addif br0 tap0
		`which ifconfig` tap0 0.0.0.0 promisc up
		`which ifconfig` eth1 0.0.0.0 promisc up
	    
		; przyk�adowy konfig dla bridge'a po stronie bramy VPN
		dev tap0
		; zamiast local_ip remote_ip jest tylko klasa wewn. sieci
		ifconfig 10.0.0.0 255.255.255.0
		ifconfig-nowarn
		; port 5000
		user nobody
		group nobody
		comp-lzo

		ping 15
		ping-restart 45
		ping-timer-rem
		persist-tun
		persist-key
		verb 3
		; tutaj u�y�em prostszej metody klucza wsp�dzielonego, ale mo�na
		; oczywi�cie u�y� certyfikat�w.
		secret /etc/openvpn/secret.key
	    

G��wna r�nica w pliku konfiguracyjnym to:

I tyle , w przypadku bridgowania nie trzeba (z za�o�enia) ustawia� �adnych tras routingu - jeste�my przecie� wewn�trz sieci firmowej :)


Pewnie kiedy� przyjdzie moment, w kt�rym wyga�nie tw�j self-signed CA.crt (certyfikat wystawcy). W�wczas przestan� dzia�a� wszystkie tunele. Mo�esz oczywi�cie wygenerowa� nowy CA.crt, ale w�wczas musia�by� tak�e wygenerowa� nowe certyfikaty dla ka�dego usera.A tego raczej nie chcesz :) Poni�ej podaj� polecenie jak wygenerowa� nowy CA.crt na podstawie starego. Dzi�ki temu unikniesz generowania nowych cert�w dla user�w. Jedyne co b�dziesz musia� zrobi�, to podmieni� po stronie bramy VPN plik ca.crt oraz wys�a� go ka�demu z u�ytkownik�w.
openssl x509 -in ca-old.crt -days 3650 -out ca-new.crt -signkey private/ca.key


linki

26.12.2003 , ^marek/(o)\rojcanet/(-)pl$