Az OpenVPN finomhangolása

A HupWiki-ből...

Virtuális hálózati csatlakozás létesítése internetre csatlakozó kliens és szerver között

Tartalomjegyzék

Előszó

Gondolom más is van rajtam kívül, akinek ugyan nem újdonság a VPN, vagyis a Virtual Privat Netvork, de ahogy nekem is kellett, most igen rövid idő alatt kellene eredményt produkálnia. Ilyenkor kézenfekvő megoldás a Google és a keresgélés.

Az alábbiakban már egy "kész" receptet találsz arra hogyan hozz létre Linux (Debian 3.0) és MS Windows XP MS Windows 2000 operációs rendszerek között VPN kapcsolatot

A probléma

Adott egy tűzfal amin GNU/Debian Linux 3.0 OS fut 2.4.24-es kernellel, ezen keresztül meg kell oldani, hogy a cég néhány munkatársa távolról csatlakozhasson a hálózat szervereihez és azokon munkát végezhessenek. A csatlakozáshoz MS Windows rendszereket fognak használni. Továbbá fontos, hogy akár munka közben akár a munka végeztével a belső hálózat biztonságban legyen.

Megoldási lehetőségek

Némi keresgélés után több megoldási lehetőség is adódik

  • IPSec
Meglehetősen elterjedt (a routerek is rendelkeznek ilyen vagy hasonló szolgáltatással) jól dokumentált, de Windowson beállítani rémálom
Döbbenet, 2004.04.22 -ei a legfrissebb (befejezték a fejlesztését)
Bár jól dokumentált
A FreeS/WAN kódja alapján folyamatosan fejlesztett VPN megvalósítás. Beállítása hasonló (nagyrészt megegyezik) a FreeS/WAN beállításához és annak dokumentációja, illetve a sajátja alapján viszonylag könnyen konfigurálható.
Jól dokumentált
A legfrissebb 2.0.9 (2006. 10. 01.-én)
Könnyen paraméterezhető
Linux és Windows platformon is létezik és megbízható
Vannak apróbb, potenciális biztonsági problémái, de ezek megfelelően kezelhetők
Van belőle Debian csomag

Lépésről lépésre

  • Az OpenVPN IP-IP alagutazást használ.
  • Ha a kernel támogatja (ezt ellenőrizni kell, lásd lejjebb), létrehozza a tunel eszközt telepítéskor
  • Működik TCP/UDP protokollokkal is de az UDP ajánlott.
  • OpenSSL segítségével létrehozott kulcsokkal azonosítja a klienst a server
  • A kliensek, ha szükséges egymást is láthatják (közös munka), bár ez ellenjavalt, tapasztalatom szerint nem nagyon van rá szükség.
  • A kliensek bejelentkezése, kijelentkezése és munkájuk szükség esetén jól figyelemmel követhetők, illetve logolt
  • A kliens oldalon is futtatható szolgáltatásként, autómatikus és kézi indítással egyaránt

OpenVPN beszerzése

Letöltheted a saját oldalukról a forráskódot, illetve a Windows installert (található itt egy GUI-val működtethető változat linkje is). A fordítás nem bonyolult, de mivel gyorsan kellett így ezzel nem foglalkoztam, de minden benne van a README-kben, tehát RTFM.

Telepítés előkészítése

Mielőtt telepíteni kezdessz néhány dolgot ellenőrizz! Létezik-e a tunnel eszköz:

 ls -lah /dev/net/ | grep tun

Ha nincs ilyen készítened kell:

 mknod /dev/net/tun0 c 10 200

Támogatja-e a kerneled a virtuális hálózati eszközöket, alagutakat:

 modprobe -l | grep tun

(Bár ha a kernel moduláris az rizikó faktor főképp egy tűzfal esetében. Ha jól van felkészítve a tűzfalad és monolitikus kernelt használsz ez nem is ad eredményt, ebben az esetben a menuconfig segít, nézzd meg abban a Network Device Support ---> Universal TUN/TAP device driver support. Ha nem forgattál be ilyen támogatést (tunneling), fordítsd újra a kernelt. Ha moduláris kernelt használsz be kell még töltened a tun modult.

 insmod tun

A tulajdonképpeni telepítés

Mostmár akár telepíthetünk is

Csomagok telepítése

Mint ahogy már ítram nem bonyolult a forgatás, de én csomagot telepítettem, tehát:

 apt-get install openvpn

Így a függőségekkel együtt feltelepül és elvégzi a szükséges beállításokat. (Alapvetően innen már majdnem működőképes az OpenVPN.)

Létrehozott a telepítő a /usr/share/doc/packages/openvpn alatt egy könyvtárat amiben minden benne van ami nekünk kell, nézzük is meg, mi is van benne

 ls -lahR /usr/share/doc/packages/openvpn | less

Hogy később gyorsabban dolgozhassunk (és hogy rendet tartsunk) ezt a könyvtárat másoljuk át

 mkdir -p /usr/share/openvpn
 cp /usr/share/doc/packages/openvpn/* /usr/share/openvpn/*

mivel kell még ide néhány könyvtár és fájl azokat hozzuk létre

 cd /usr/share/openvpn/easy-rsa/2.0/
 mkdir keys
 cd keys/
 echo 01 > serial
 touch index.txt

Találhatók itt példa configok, és jó kis shell scriptek amik oly gyorsá teszik a beállítást. Kezdődhet is a használatbavétel. Lépjünk be tehát a /usr/share/openvpn/easy-rsa/2.0 könyvtárba és itt szerkesszük úgy a vars állományt, hogy a file végén található változókba értelem szerint behelyettesíted az értékeket.

 export KEY_COUNTRY="HU"
 export KEY_PROVANCE=""
 export KEY_CITY="Városom"
 export KEY_ORG="NIMPHAS Corp."
 export KEY_EMAIL="it@nimphas.com"

Azért mielőtt lecserélnéd, vagy szerkesztenéd a vars fájlt másold le mondjuk vars.old címmel. Ezeken kívül kell még néhány további fájl és könyvtár:

 mkdir /var/log/openvpn
 touch /etc/openvpn/ipp.txt

Kell egy server konfigurációs fájl én ezt használom server.conf néven van elmentve a /etc/openvpn könyvtárban (a /usr/share/doc/packages/openvpn/sample-config könyvtárban találsz részletesebbeket is magyarázatokkal, feltétlen nézd meg őket):

 port 1194
 proto udp
 dev tun
 ca /etc/openvpn/ca.crt
 cert /etc/openvpn/server.crt
 key /etc/openvpn/server.key
 dh /etc/openvpn/dh1024.pem
 server 10.8.0.0 255.255.255.0
 ifconfig-pool-persist /etc/openvpn/ipp.txt
 push "route 192.168.5.0 255.255.255.0" # A helyi hálózathoz való routolás
 keepalive 10 120
 comp-lzo
 ;client-to-client # Engedélyezi, hogy a távolról felcsatlakozó kliensek "lássák egymást"
 persist-key
 persist-tun
 status /var/log/openvpn/openvpn-status.log
 verb 3
 mute 20

Tanúsítványok készítése

Ha a könyvtárak és fájlok elkészültek, létrhozzuk a tanusítványokat: A felső szintű tanusítvány és kulcs generálása:

   cd /usr/share/openvpn/easy-rsa/2.0
   source vars
   ./build-ca

Diffie Hellman paraméter előállítása (ez egy igen hosszú alap értelmezés szerint 1024 bit hosszú prímszám)

   ./build-dh

Paranojások a KEY_SIZE értékét megnövelhetik (a vars állományban), de ez nem szükséges, nagyban nem növeli a biztonságot de az előállítás idejét igen.

(Ha az unable to write 'random state' hibaüzenetet kapod segíthet ez az oldal: http://www.openssl.org/support/faq.cgi Próbáld meg ezt a parancsot: export KEY_SIZE=1024 && export KEY_DIR=$(pwd)/keys && export KEY_CONFIG=$(pwd)/openssl.cnf && export HOME=$(pwd)/keys && export RANDFILE=$(pwd)/keys && ./build-dh)

Következhet a server kulcsok legyártása

   ./build-key-server server

A paraméter amit vár a fájl neve (a kiterjesztés nékül). Így mostmár a legszükségesebb tanusítványok készen vannak, ezután csak a kliensek tanusítványai vannak hátra. Tehát készítsük el ezeket is:

   source vars
   ./pkitool --interact --inter client00

A paramétereket a ./pkitool --help elmagyarázza, amit itt használtam:

--interact = interaktív kulcsgenerálás Ez annyit jelent, hogy a tanusítvány adatait meg kérdezi tőled, csak annyi a dolgod, hogy elolvasod a kérdést és ésszerűen válaszolsz rájuk
--inter = belső kulcs generálása
client00 = a létrehozandó állományok nevének az eleje

Ezt persze addig ismételjük ameddig minden kliens tanusítványait el nem készítettük. Ha megvannak át másolgathatjuk őket a helyükre, illetve a kliensek fájljait be is tömöríthetjük, hogy aztán egyszerűbb legyen bánni velük

A serveren használandó tanusítvány állományai:

 ca.crt
 ca.key
 server.crt
 server.csr
 server.key
a "server.*" csak akkor érvényes, ha a ./build-key-servernek paraméterként a servert adtad meg.

A kliens által használt tanusítvány fájljai:

 ca.crt
 ca.key
 client00.crt
 client00.csr
 client00.key

Ha a ./pkitoolnak ezt adtad meg

Rendrakás

  • A server tanusítványait az /etc/openvpn könyvtárba kell rakni,
  • A server.conf -nak szintén ott a helye
  • A kliensek tanusítványainak fájljait a /usr/share/openvpn/easy-rsa/2.0/configs/client* könyvtárakban tartom *.tgzbe tömörítve. innen scpvel könnyen átmásolhatók az állományok és egyhelyen vannak

Kliensek telepítése

Windows

Ez sem bonyolult az OpenVPN oldaláról letölthető installer szinte mindent meg csináll. Itt is kell készítenünk egy configot (client.ovpn itt a kiterjesztés csak ez lehet), valahogy így nézzen ki:

 client
 remote xxx.xxx.xxx.xxx # a távoli server IP címe megadhatsz domaint is
 port 1194
 proto udp
 ca C:\\Progra~1\\OpenVPN\\config\\ca.crt
 cert C:\\Progra~1\\OpenVPN\\config\\client.crt
 key C:\\Progra~1\\OpenVPN\\config\\client.key
 dev tun
 comp-lzo
 verb 3
 mute 10
 ns-cert-type server
 persist-key
 persist-tun

Ha elkészítetted, pl jegyzettömbel, vagy valamilyen text editoral mentsd el az OpenVPN/config könyvtárba client.ovpn névvel. Az indításhoz pedig egy kis denevér (Én ovpn.bat névvel szoktam a config könyvtárban elhelyezni):

 openvpn --config C:\\Progra~1\\OpenVPN\\config\\client.ovpn

Ha lefuttatod létrejön a VPN kapcsolat ezt onnan tudod, hogy megnyílik egy parancssori ablak és egy csomó bla-bla után kiíródik a Connection Saccesfulli Completted, illetve az ablak nyitva is marad, hogy a kapcsolat megmaradjon pingelgeti a hálózatot, és hálózati csomagokat küldözget a távoli hálózatba. Ha a Windows kliensnek a munkacsoportja ugyan az mint a hálózat gépeié akkor kisvártatva a hálózati helyek között meg is jelennek a gépek ikonjai. Még annyit érdemes megtenni a kényelem kedvéért, hogy teszel parancsikont az asztalra (már arra amit a monitoron látsz ;-) ).

Linux kliens

A server beállításaitól csak anyiban különbözik, hogy itt a config más (ugyan az mint a windows kliens esetében értelem szerint a ~/.openvpn/ könyvtárba kell tenni a tanusítványhoz kapcsolódó fájlokat, az útvonalakat a helyesre megadni és csatlakozni a

 openvpn --config ~/.openvpn/client.ovpn

parancsal. Annyit azért ne felejts el, hogy itt nem indul el konzol, ha látni akarod a történéseket konzolon indítsd az OpenVPNt

Ötletek

  • Kimondottan rossz ötlet a tanusítványokban client1..client2..client3..stb nevezni a klienseket, egyfelöl mert van nevük, meg így jól nyomon követhető ki mikor jelentkezett be.
  • Kimondottan rossz ötlet engedélyezni olyan kliensek csatlakozását, amelyeket nem védi legalább szoftveres tűzfal és vírusvédelmi program
  • Kimondottan rossz ötlet mindenkinek engedélyezni a VPN használatát
  • Kimondottan jó ötlet a felhasználókat nyilvántartani (e-mail, hanyas kliens, mettől-meddig érvényes a kulcsa, melyík részlegben dolgozik, mit csinál, mit használ, hálózati eszköz MAC címe)
  • Kimondottan jó ötlet az iptablessel a MAC címeket szűrni, mondjuk valahogy így:
 iptables -A INPUT -i tun+ -p UDP -m mac --mac-source 00:00:00:00:00:00 -j ACCEPT
Persze a 00:00:00:00:00:00 helyére a valódi MAC cím kerüljön
  • Kimondottan jó ötlet csak egy adott idő intervallumban engedélyezni a csatlakozást, ha lehet és nem ütközik akadályokba, modjuk 6:30 - 21:00 és a crond segítségével indítani és leállítani (A nyugalmad érdekében)



Egyéb...!

És akkor még valami, mire használhatók ezek a tanusítványok. Mivel a kliensek mindegyikére be kell másolni a felső szintű tanusítványt és a kliens tanusítványát, ezt elektronikus aláírásként is használhatod. A ca.crt hozzáadod a felső szintű tanusítványaidhoz és a client.crtt csatolod tanusítványként a leveleidhez (hivatalos levelezéshez) máris elektronikusan aláírtak a leveleid, ha a cégen belüli gépeken elvégzi ezt mindenki a levelezés máris bizonságosabbá tehető

Samba

Ha Samba serverhez szeretnéd, hogy hozzáférjenek a VPN-en keresztül a felhasználók, akkor azt az smb.conf állományban lehetővé kell tenned:

   hosts allow = ... 10.8.0.0/24 # Ez a címtartomány amit a server.conf-ban megadtál a server 10.8.0.0 direktívánál

Végezetül

Úgy kb ennyi, ha kérdésed lenne ezzel kapcsolatban: [1]

Kapcsolódó szócikkek

SSL
TLS
VPN

Kapcsolódó linkek

OpenVPN
OpenVPN letöltés
OpenVPN FAQ
OpenVPN csomaginfok
OpenSSL
Linux 2.4 Csomagszűrő HOWTO