OpenVPN
Sisukord
Sissejuhatus
OpenVPN abil saab korraldada erineval viisil arvutite ja võrkude omavahelist suhtlemist, sh on võimalik saavutada praktiliselt samasuguseid tulemusi nagu IPSec abil. Kui IPSec on mõnes mõttes klassika, kuid mille tööleseadmine on sõltuvalt platvormist vähem või rohkem keeruline, siis OpenVPN on nö moodne ja turvaline lahendus, mida on erinevatel platvormidel suhteliselt lihtne käivitada. Kusjuures IPSecil on olemuslikud raskused NAT seadmetest läbiminemisel mida aga OpenVPN puhul ei ole. OpenVPN kasutab andmevahetusel vaikimisi UDP protokolli.
Käesolevas tekstis kirjeldatakse OpenVPN kasutamist eesmärgiga on seada käima turvaline ühendus ühe OpenBSD arvuti ja ühe või mitme Debian arvuti vahel. Antud palas kirjeldatud asjakorraldust võiks ette kujutada selliselt, et OpenBSD juures töötab OpenVPN server režiimis ning Debianil klient režiimis, kusjuures klient saab ligi OpenBSD külge ühendatud võrkudele sh avalikule võrgule. Samas, käesolev tekst peaks andma piisavalt üldise ja samas detailse käsitluse, mida saab kasutaja varieerida omale sobiva lahenduse moodustamiseks.
Kuna andmevahetuse krüptimisel kasutatakse sertifikaate, siis OpenVPN tarkvaraga koos jagatakse ka pisikest CA tarkvara, millega on mõnus sertifikaate hallata.
OpenVPN kasutamisel on oluline, et osalevate arvutite kellaajad oleksid õiged, alates sertifikaatide moodustamisest.
Ruuditud ja sillatud ühendused
OpenVPN kasutab OpenBSD poolel tun seadet ning Linuxi poolel analoogilist tun/tap seadet. Need on virtuaalsed võrguseadmed, mis tähendab, et nad on realiseeritud tarkvaraliselt võimaldades neid kasutaval programmil saata andmeid operatsioonisüsteemi võrgu pinnu (ingl. k. networking stack) ning vastupidi, võtta sealt andmeid vastu.
tun/tap seade võib töötada kahes kihis võimaldades vastavalt kahte erinevat OpenVPN kasutusjuhtu
- ruuditud ühendus - tun/tap seade töötab ip kihis (layer 3), Linuxi puhul tun
- sillatud ühendus - tun/tap seade töötab etherneti kihis (layer 2), Linuxi puhul tap
Ruuditud ühendust kirjeldab selline skeem
-------|-------- wire - 192.168.3.0/24 ----- | | __|__ em0 192.168.3.254/24 | | TUVIKE | | tulemüür, tun0: 10.8.0.1 <--- P2P ---> 10.8.0.2 |_____| | fxp0 172.16.2.1/28 | internet | | 172.16.5.15/30 __|__ | | KALAKE | | nö üksik arvuti |_____| tun0: 10.8.0.2 <--- P2P ---> 10.8.0.1
OpenVPN tulemusena moodustub mõlemasse arvutisse ruutivas režiimis tun seade (st point-to-point), mille ühest otsast saab pöörduda teise otsa poole. Lisaks saab läbi selliselt moodustatud ühenduse ruutida ka alamvõrke, näiteks
- Kui Kalake OpenVPN klienida lisab oma ruutingutableisse, et 192.168.3.0/24 võrgu lüüsiks on 10.8.0.1, siis saab ta suhelda Tuvikese taga olevate arvutitega üle OpenVPN ühenduse.
- Samuti on võimalik korraldada, et Kalake ruudib lisaks muid võrke sh avalikust internetist 10.8.0.1 peale, siis toimub ka nendega suhtlemine läbi OpenVPN ühenduse; põhimõtteliselt võib Kalake seada ka oma vaikelüüsiks 10.8.0.1, kuid siis peab kalake jätma oma ruutingutabelisse mõne erandi, et see ühendus üle avaliku interneti punktide 172.16.5.15 ja 172.16.2.1 vahel üle mille käib OpenVPN tunnel ise alles jääks.
Ruuditud ühenduse puhul paistab Tuvikesele ja sealtkaudu ligipääsetavatele arvutitele Kalakese ip aadressiks 10.8.0.2.
Sillatud ühendust kirjeldab selline skeem
-------|-------- wire - 192.168.3.0/24 ----- | | __|__ em0 192.168.3.254/24 | | TUVIKE | | tulemüür, bridge0: ip aadressi ei ole, tun0 ja em0 on sillaga kokku ühendatud |_____| | fxp0 172.16.2.1/28 | internet | | 172.16.5.15/30 __|__ | | KALAKE | | nö üksik arvuti |_____| tap0: Tuvikese OpenVPN serveri poolt omistatud mac aadress ja ip aadress
Sillatud režiimi puhul omistab Tuvikeses töötav OpenVPN Kalakese tun seadmele genereeritud mac aadressi ning 192.168.3.0/24 võrgust IP aadressi. Kalakese tap0 seade on üle tuvikese tun0 ja em0 seadmetest moodustatud silla ühendatud 192.168.3.0/24 võrku.
Seda kui palju Kalakesest väljuvat liiklust käib otse avalikku võrku läbi füüsilise seadme ja kui palju liigub läbi tunneli saab korraldada Kalakese ruutingutabli abil. Näiteks, et 10.0.100.0/24 võrgu suhtlemine toimuks läbi Tuvikese tuleb öelda Kalakeses
# route add -net 10.0.100.0 netmask 255.255.255.0 gw 192.168.3.254
OpenVPN tarkvara paigaldamine
Käesolevas tekstis kirjeldatakse OpenVPN tarkvara versioon 2.0 kasutamist.
Debianile tuleb paigaldada pakett openvpn
# apt-get install openvpn
Käesoleva punkti edasine jutt puudutab OpenBSD poolt, mis on OpenVPN serveriks, seal moodustatakse kasutatavad sertifikaadid ja jaotatakse OpenVPN klientidele laiali.
OpenBSD arvutil paigaldada pakett openvpn
# pkg_add openvpn
OpenVPN ruuditud ühenduse katsetamine
Selleks, et veenduda, et arvutitesse on OpenVPN tarkvara paigaldamine õnnestunud sh virtuaalsete seadmete jaoks on olemas vajalikud tuumamoodulid ning osaliste versioonid omavahel sobivad.
Krüptimata ühendus
Lihtsamal juhul, kus andmevahetust ei krüptita pole vaja midagi ettevalmistada, vajalikud parameetrid näidatakse käsureal öeldes Tuvikeses
tuvike-debian# openvpn --remote 172.16.5.15 --dev tun0 --ifconfig 10.8.0.1 10.8.0.2 --verb 3 Sat Jul 26 12:44:34 2008 OpenVPN 2.1_rc7 i486-pc-linux-gnu [SSL] [LZO2] [EPOLL] built on Jun 16 2008 Sat Jul 26 12:44:34 2008 IMPORTANT: OpenVPN's default port number is now 1194, based on an official port number assignment by IANA. OpenVPN 2.0-beta16 and earlier used 5000 as the default port. Sat Jul 26 12:44:34 2008 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext Sat Jul 26 12:44:34 2008 TUN/TAP device tun0 opened Sat Jul 26 12:44:34 2008 TUN/TAP TX queue length set to 100 Sat Jul 26 12:44:34 2008 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500 Sat Jul 26 12:44:34 2008 Data Channel MTU parms [ L:1500 D:1450 EF:0 EB:4 ET:0 EL:0 ] Sat Jul 26 12:44:34 2008 Local Options hash (VER=V4): '7d01953d' Sat Jul 26 12:44:34 2008 Expected Remote Options hash (VER=V4): '08b6a7d0' Sat Jul 26 12:44:34 2008 Socket Buffers: R=[109568->131072] S=[109568->131072] Sat Jul 26 12:44:34 2008 UDPv4 link local (bound): [undef]:1194 Sat Jul 26 12:44:34 2008 UDPv4 link remote: 172.16.5.15:1194 Sat Jul 26 12:44:40 2008 Peer Connection Initiated with 172.16.5.15:1194 Sat Jul 26 12:44:40 2008 Initialization Sequence Completed
ning öeldes Kalakeses
kalake-openbsd# openvpn --remote 172.16.2.1 --dev tun0 --ifconfig 10.8.0.2 10.8.0.1 --verb 3 Sat Jul 26 12:43:33 2008 OpenVPN 2.0.9 i386-unknown-openbsd4.3 [SSL] [LZO] built on Mar 13 2008 Sat Jul 26 12:43:33 2008 IMPORTANT: OpenVPN's default port number is now 1194, based on an official port number assignment by IANA. OpenVPN 2. 0-beta16 and earlier used 5000 as the default port. Sat Jul 26 12:43:33 2008 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext Sat Jul 26 12:43:33 2008 /sbin/ifconfig tun0 destroy Sat Jul 26 12:43:33 2008 /sbin/ifconfig tun0 create Sat Jul 26 12:43:33 2008 NOTE: Tried to delete pre-existing tun/tap instance -- No Problem if failure Sat Jul 26 12:43:33 2008 /sbin/ifconfig tun0 10.8.0.2 10.8.0.1 mtu 1500 netmask 255.255.255.255 up Sat Jul 26 12:43:33 2008 TUN/TAP device /dev/tun0 opened Sat Jul 26 12:43:33 2008 Data Channel MTU parms [ L:1500 D:1450 EF:0 EB:4 ET:0 EL:0 ] Sat Jul 26 12:43:33 2008 Local Options hash (VER=V4): '08b6a7d0' Sat Jul 26 12:43:33 2008 Expected Remote Options hash (VER=V4): '7d01953d' Sat Jul 26 12:43:33 2008 UDPv4 link local (bound): [undef]:1194 Sat Jul 26 12:43:33 2008 UDPv4 link remote: 172.16.2.1:1194 Sat Jul 26 12:43:43 2008 Peer Connection Initiated with 172.16.2.1:1194 Sat Jul 26 12:43:44 2008 Initialization Sequence Completed
Kummassegi arvutiss moodustatakse automaatselt tun seade ning seadistatakse vastavalt käsureal näidatud parameetritele, OpenBSD poolel
kalake-openbsd# ifconfig tun0 tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500 groups: tun inet 10.4.0.2 --> 10.4.0.1 netmask 0xffffffff
ning Debiani poolel
tuvike-debian# ifconfig tun0 tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.4.0.1 P-t-P:10.4.0.2 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:31 errors:0 dropped:0 overruns:0 frame:0 TX packets:33 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:4604 (4.4 KiB) TX bytes:5508 (5.3 KiB)
Ühenduse kontrollimisel peab saama teise arvutisse üle võrgu ligi, nt pingida või ssh abil sisse logida pöördudes tunneli teise otsa aadressiga. Millegipärast OpenBSD poolel ei saa nö omapoolse otsa poole pöörduda, aga praktiliselt ei ole see ka oluline.
Staatilise võtmega krüptitud ühendus
Sarnane eelmisele, kuid ühenduse krüptimiseks kasutavad osalised ühist saladust staatilise võtme kujul. Esmalt tuleb moodustada saladus öeldes
# cd /etc/openvpn # openvpn --genkey --secret saladus.key
Seejärel kopeerida teisele osalisele ning öelda
kalake-openbsd# openvpn --remote 192.168.50.144 --dev tun0 --ifconfig 10.4.0.2 10.4.0.1 --verb 3 --secret saladus.key tuvike-debian# openvpn --remote 172.16.0.254 --dev tun0 --ifconfig 10.4.0.1 10.4.0.2 --verb 3 --secret saladus.key
Sertifikaatide ettevalmistamine
Lisaks krüptimita ja staatilise võtmega krüptitud ühendusele saab OpenVPNi seadistada kasutama avaliku võtme sertifikaate ja seda tulekski OpenVPNi nö tootmises kasutamisel eelistada. OpenVPN pakett sisaldab avaliku võtmega krüptimisel vajalike sertifikaatide halduseks pisikest CA programmide kompleti. Käesolevas punktis kirjeldatakse selle CA kasutamist OpenBSD platvormil, eesmärgiks on moodustada sertifikaadid ning need seejärel osa neist klientidesse kopeerida.
Esmalt tuleb moodustada mõned kataloogid ja failid
# mkdir /etc/openvpn /etc/openvpn/keys # touch /etc/openvpn/keys/index.txt # echo 01 > /etc/openvpn/keys/serial # cp /usr/local/share/examples/openvpn/easy-rsa/openssl.cnf /etc/openvpn
Seada sobivab keskkonnamuutujad
# . /usr/local/share/examples/openvpn/easy-rsa/vars
Seejärel tuleb genereerida sertifikaadid
- Süsteemi CA sertifikaat
# cd /etc/openvpn/keys # /usr/local/share/examples/openvpn/easy-rsa/build-ca
Oluline on, et CA ja järgneval serveri sertifikaadil oleks sama organisatsiooni nimi, sisestage mõistlikud andmed, näiteks
... Country Name (2 letter code) [KG]:EE State or Province Name (full name) [NA]:Tartu Locality Name (eg, city) [BISHKEK]:Tartu Organization Name (eg, company) [OpenVPN-TEST]:LOOMAAED Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:ca.loomaaed.tartu.ee Email Address [me@myhost.mydomain]: ca@ca.loomaaed.tartu.ee ..
Tekivad failid
keys/ca.key keys/ca.crt
- OpenVPN serveri sertifikaat
# /usr/local/share/examples/openvpn/easy-rsa/build-key-server server ... The Subject's Distinguished Name is as follows countryName :PRINTABLE:'EE' stateOrProvinceName :PRINTABLE:'Tartu' localityName :PRINTABLE:'Tartu' organizationName :PRINTABLE:'LOOMAAED' commonName :PRINTABLE:'tuvike.loomaaed.tartu.ee' emailAddress :IA5STRING:'ca@ca.loomaaed.tartu.ee' Certificate is to be certified until Jul 23 18:03:58 2018 GMT (3650 days) Sign the certificate? [y/n]:y ..
Tekivad failid
./keys/server.key ./keys/server.crt
- OpenVPN kliendi sertifikaat
# /usr/local/share/examples/openvpn/easy-rsa/build-key .. The Subject's Distinguished Name is as follows countryName :PRINTABLE:'EE' stateOrProvinceName :PRINTABLE:'Tartu' localityName :PRINTABLE:'Tartu' organizationName :PRINTABLE:'LOOMAAED' commonName :PRINTABLE:'kalake.loomaaed.tartu.ee' emailAddress :IA5STRING:'ca@ca.loomaaed.tartu.ee' Certificate is to be certified until Jul 23 18:11:25 2018 GMT (3650 days) Sign the certificate? [y/n]:y ..
Tekivad failid
./keys/kalake.key ./keys/kalake.crt
Süsteemi CA sertifikaat ning kliendi sertifikaat ning salajane võti tuleb kopeerida kliendi arvutisse
# scp keys/kalake.crt keys/kalake.key keys/ca.crt root@kalake/etc/openvpn
- Diffie-Hellmani asjad
# /usr/local/share/examples/openvpn/easy-rsa/build-dh
Tekib fail
./keys/dh1024.pem
OpenVPN ruuditud lahenduse seadistamine
Seadistame käima sillatud ühenduse vastavalt ülaltoodud skeemile.
OpenBSD poole seadistamine
Serveri poolel sobib kasutada sellist seadistusfaili ruuditud režiimis
# cat /etc/openvpn/openvpn.conf local 10.0.10.251 port 1194 proto udp dev tun0 ca keys/ca.crt cert keys/server.crt key keys/server.key dh keys/dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist /tmp/ipp.txt push "redirect-gateway local def1" keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun status /var/log/openvpn-status.log verb 3
Debiani poole seadistamine
OpenVPN kliendile vajalikud võtmed moodustatakse OpenVPN serveris ja kopeeritakse klienti nii nagu sertifikaatide punktis on öeldud.
Kliendi poolel sobib bridge režiimis kasutada sellist seadistusfaili
remote cel.auul dev tun ifconfig 10.8.0.2 10.8.0.1
Käivitamine toimub öeldes
# cd /etc/openvpn # openvpn --config openvpn.conf
OpenVPN sillatud lahenduse seadistamine
Seadistame käima sillatud ühenduse vastavalt ülaltoodud skeemile.
OpenBSD poole seadistamine
Vajalik on moodustada sild füüsilise ja tun seadme vahele
# ifconfig bridge0 create # ifconfig tun0 link0 up # brconfig bridge0 add em1 add tun0
Serveri poolel sobib kasutada sellist seadistusfaili sillatud režiimis
# cat /etc/openvpn/openvpn.conf local 10.0.10.251 port 1194 proto udp dev-type tap dev tun0 ca keys/ca.crt cert keys/server.crt key keys/server.key dh keys/dh1024.pem server-bridge 172.16.0.254 255.255.255.0 172.16.0.210 172.16.0.220 ifconfig-pool-persist /tmp/ipp.txt push "redirect-gateway local def1" keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun status /var/log/openvpn-status.log verb 3
Käivitamiseks tuleb öelda
# cd /etc/openvpn # openvpn --config openvpn.conf
Debiani poole seadistamine
OpenVPN kliendile vajalikud võtmed moodustatakse OpenVPN serveris ja kopeeritakse klienti, vajalikud on sellised failid
# scp keys/sid1.crt keys/sid1.key keys/ca.crt root@192.168.50.144:/etc/openvpn
Kliendi poolel sobib bridge režiimis kasutada sellist seadistusfaili
# cat /etc/openvpn/openvpn.conf client dev tap proto udp remote 10.0.10.251 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert sid1.crt key sid1.key comp-lzo verb 3
Käivitamine toimub öeldes
# cd /etc/openvpn # openvpn --config openvpn.conf