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 RSAJe�li wystarczy Ci rozwi�zanie oparte o klucz wsp�dzielony - mo�esz przeskoczy� od razu do dzia�u konfiguracja OpenVPNRozwi�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.
Musimy wyr�ni� nast�puj�ce poj�cia:
[ 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 fileWa�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/serialMo�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
generujemy klucz prywatny wystawcy certyfikatu cakey.pem
openssl genrsa -des3 -out private/cakey.pem 1024Nale�y tu poda� has�o - b�dzie nam p�niej potrzebne przy wystawianiu certyfikatow innym jednostkom.
openssl req -new -x509 -days 1825 -key private/cakey.pem -out cacert.pemJako 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 1024Problem 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.pemPotwierdzamy has�em klucza prywatnego BRAMY
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�:
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.pemTeraz 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.pemTak naprawd� cakey.pem jest potrzebny tylko do podpisywania nowych wniosk�w. Do samego dzia�ania tunela nie jest on potrzebny.
route add siec_firmowa MASKA gw ip_virtualne_bramy_vpnWydajniejsze 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_forwardnast�pnie za�aduj driver obs�ugi tunela:
modprobe tun
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 ; eofPo 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 ; eofOczywi�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).
openssl dhparam -out dh1024.pem 1024Maj�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 ;eofKonfiguracja 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
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'
; 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.1Po wpisaniu powy�szego powinno da� si� pingowa� komputery w sieci wewn�trznej firmy (np. 10.0.0.5)
`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:
openssl x509 -in ca-old.crt -days 3650 -out ca-new.crt -signkey private/ca.key
26.12.2003 , ^marek/(o)\rojcanet/(-)pl$