Fagzal blogja

Csatornák : MIND    USA - személyes  (31)   Perl 5  (3)   Random  (4)  
VPN beállítása Linuxon (Fedora + OpenVPN)
2008, Április 2., 11 óra

Aki esetleg nem vágná, mi is az a VPN, annak valószínűleg úgysincsen rá szüksége, és ne is olvassa tovább. Mindamellett röviden azért, a köz okulása végett:

A VPN (Virtual Private Network) segítségével hálózatokat lehet összekapcsolni, méghozzá biztonságos (titkosított) módon. A tényleges kapcsolat persze mindig két gép között jön létre, sőt az is lehet, hogy csak két gép a hálózat tagja, mindazonáltal ez ritka: a gyakoribb az, hogy egy/több gépet csatolunk be egy már meglévő hálózata.
Például: egy cég két irodájának a gépeit egyetlen hálózatban akarjuk látni. Vagy: a munkahelyi hálózatunkra csatlakozunk rá otthonról.
A VPN nem szerver-kliens jellegű kapcsolat: fizikai kapcsolatot "emulálunk", mintha mondjuk egy b*szott hosszú kábellel kötnénk be mondjuk az otthoni laptopunkat pl. egy egyetemi hálózatba, minek hatására a gépünk úgy viselkedik, mintha tényleg ott lenne az a kábel.

A VPN felépítése sajnos nem annyi, hogy elindítunk valami service-t aztán jólvan. A problémák:
- A VPN nem egy protokol, mint mondjuk a HTTP, hanem egy fogalom, architektúra: ennek megfelelően mindenképppen választanunk kell egy VPN szoftvert, amihez megfelelő szerver mellett megfelelő (értsd: minden csatlakozni kívánó gépen futó) kliens is tartozik.
- Az egyes VPN szoftverek tipikusan nem kompatibilisek egymással.
- Rendszerszinten a fogadó (szerver) oldalon a VPN beállítása nem elég: jellemzően egyéb trükköket is kell alkalmazni, pl. routing tábla módosítása, IP forward, stb.
- Egyáltalán nem biztos, hogy vannak statikus IP címeink (ez ugye főleg a szerver oldalon gond), ami bonyolítja a helyzetet.
- Mindenféle firewall-ok állhatnak utunkba.
- A szerver LAN-jában lévő service-eket bizonyos konfigurációban tájékoztatni kell arról, hogy megértsék a VPN által becsatolt virtuális hálózatot (ami alapból külön tartomány). Néha a LAN tartományt (pl. cím allokáció) is módosítani kell.

Két gépet összekötni VPN-nel, statikus IP-n viszonylag egyszerű - ennek megfelelően sok értelme sincs. Ígyhát egy bonyolultabb - egyébként viszont tipikus - konfigurációról lesz itt szó. Lássuk!


A körülmények:
- egy irodai hálózatba akarunk becsatlakozni, ahol már van egy lokális IP tartomány: legyen ez 192.168.1.x
- az irodába bejövő internet egy dinamikus IP-n ülő, belülre dinamikus IP-t DHCP-ző router-en ül
- ezen a router-en keresztül NAT segítségével látják a kinti hálót a gépek
- belül van egy Windows hálózat (Samba vagy nem, mindegy)
- van "az asztalon" egy Linux szerver, aminek szintén a router ad (kvázistatikus) IP-t, ami legyen mondjuk 192.168.1.10
- a Linux szerver Samba szerver is, csak hogy örüljünk

Ez egy meglehetősen tipikus konfiguráció: a legtöbb kis -és közepes munkahelyen valami ilyesmit találunk.

Amit el akarunk érni:
- "külső" gépekről (otthonról) a belső hálózatot Windows Networking-en keresztül elérni, minden szenvedés nélkül (tehát a kliensnek legyen egyszerű dolga, vagyis X.Y. hozzá nem értő munkatársunk egyszerűen tudja használni otthonról, Windows XP-ről vagy Vista-ról)

A feladathoz használt VPN szoftver az OpenVPN. Ez egy jól működő dolog, és mind Windows-on (Vista-n is), mind Linuxon remek támogatással rendelkezik. Ingyenes.
A VPN szerver egy Fedora Linux, esetünkben Fedora 8, de más verziók és más Linux disztribúciók is szinte ugyanígy használhatóak.


Mielőtt beledőlnénk a VPN-be, először is meg kell tenni a következőket:

1. Mivel a külső IP-nket dinamikusan kapjuk, egy DDNS-t kell létrehozni erre a címre. A router-ekben jellemzően be lehet állítani a dyndns.com-ot, a példa kedvéért legyen a külső dinamikus IP-nk címe az example.dyndns.com. Innentől ez mutat a router-ünk aktuális IP címére. Csináljuk ezt meg, próbáljuk ki! Nem árt, ha a 22-es portot forwardoljuk a routeren át a Linux gépre, így könnyen ellenőrizhető a dolog.

Ha megvan, akkor NEXT :)

2. A router-en az OpenVPN portját (1194) ki kell nyitni és a belső gépre irányítani. Ez lehet UDP vagy TCP - legyen most UDP. Innentől elérjük tetszőleges külső gépről a belső gépet.

3. Ki kell nyitni az 1194/UDP portot a Linux szerveren, már persze ha zárva lenne, és már ha egyáltalán használunk firewall-t, és az az IPTABLES :)) Ha igen, akkor valami ilyesmi kell a /etc/sysconfig/iptables-be:

-A INPUT -p udp -m udp --dport 1194 -j ACCEPT

ÉRTELEMSZERŰEN persze, itt nem mennék bele az Iptables configba mert soha nem érne véget ez a bejegyzés...

Ha ez megvan, akkor "a körülmények már adottak". Most lépjünk tovább - először a VPN szerver konfiggal.

Két lehetőségünk van: IP-routing és Ethernet-bridging. Pár szóban ezekről.

1. IP-routing-nál van egy belső tartományunk, és ebben van egy gép (a VPN szerver). A VPN ezen a gépen egy MÁSIK tartományt (subnet-ekről beszélek, persze) hoz létre, ide csatlakoznak a kliensek.
A dolog egyszerű és könnyen beállítható, nem kell hozzá csak az OpenVPN szerver meg a kliens. A baj az, hogy ez két KÜLÖNBÖZŐ hálózat, még ha egy gépen vannak is: a belső tartományunk nem fog "magától kilátszódni" a kliensnek, így pl. egy broadcast-olt packet a belső tartományból nem fog elérni a klienshez, ami mondjuk SMB esetén nem a legjobb...

2. Ethernet-bridge esetén a klienset a belső hálózatBA csatoljuk úgy, hogy egy IP-tartományt elkülönítünk a klienseknek. IP címünk a privát hálózatok miatt tipikusan van, viszont ez a fajta konfiguráció bonyolultabb: nem elég az OpenVPN konfigurálása, az oprendszert is rá kell venni, hogy a két interface-ünket - a meglevőt, illetve azt, ahol a VPN csatlakozik - bridge-elje össze mint egy fizikai bridge. Ez macerás, viszont ez az architektúra sokkal transzparensebb.

Az itt leírt példa bridge-inget használ.

Először is: még a VPN konfigurálása előtt csináljunk egy bridge-et! Erre a bridge-utils megfelelő (gyakorlatilag minden Linuxon van rá csomag, Fedora-n "yum install bridge-utils").
A bridge tulajdonképpen két interface között tud adatokat átadni. Esetünkben:
- van a fizikai hálókártyánk (mondjuk eth0)
- van (lesz) a virtuális interface-ünk a VPN jóvoltából (legyen a neve tap0)
- készítünk egy bridge-elt interface-t (mondjuk br0), amihez hozzáadjuk a fenti két interface-t, minek hatására egymásnak tudják adni a csomagokat
- a tap0 és az eth0 promoscious módban fog menni (mindent vesz), a br0 fog a régi eth0 interface-ünk "helyett" működni

Részletesebben itt lehet a bridging-ről olvasni.


Az interface elkészítéséhez az OpenVPN által ajánlott script jó is lesz:
#!/bin/bash

#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################

ifdown eth0
# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.1.10"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.1.255"

for t in $tap; do
    openvpn --mktun --dev $t
done

brctl addbr $br
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
brctl addif $br $eth

for t in $tap; do
    brctl addif $br $t
done

for t in $tap; do
    ifconfig $t 0.0.0.0 promisc up
done

ifconfig $eth 0.0.0.0 promisc up


Tartozik hozzá egy leállító script is. Ezt ne feledjük mert baj lesz :) E:
#!/bin/bash

####################################
# Tear Down Ethernet bridge on Linux
####################################

# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged together
tap="tap0"

ifconfig $br down
brctl delbr $br

for t in $tap; do
    openvpn --rmtun --dev $t
done


Ha ez megvan (elindítottuk a bridge-start -ot), megvan a brdige interface, egyúttal elvesztettük a hálózatunkat :) Don't worry, mindjárt lesz megint!

Engedjük meg a bridge elérését az Iptables-ben:
-A  -i tap0 -j ACCEPT
-A  -i br0 -j ACCEPT
-A FORWARD -i br0 -j ACCEPT


Kapcsoljuk be az IPForward-ot:
echo 1 > /proc/sys/net/ipv4/ip_forward


Most már csak a routingot kell bekapcsolni, mert a bridge még nem tudja, hova küldje a packet-eket. Felételezve, hogy a gateway címe a 192.168.1.1 :
route add default gw 192.168.1.1


Voila, ha minden igaz megint megy a net! :) Lássuk a VPN configot!


1. Az OpenVPN szerver beállítása. Első körben installáljuk talán fel :), ha még nincs:
yum install openvpn
Fedora esetében könnyen lehet, hogy eleve fel van rakva, azt hiszem ez a default. A /etc/openvpn könyvtárban fogjuk a config-okat hergelni.

Először is: kulcsokat kell generálni. Több fajta VPN config van erre vonatkozóan, mi egy igen egyszerűt fogunk használni: szerverkulcs, klienskulcs, minden kliensnek egyedi, plusz emellé egy jelszó. (A kulcsfile-okat a csatlakozni kívánó usereknek majd oda kell adni!)

A kulcsok generálásához az OpenVPN ad mindenféle scripteket. Ezek a /usr/share/openvpn/easy-rsa/2.0/ könyvtárban (vagy valahol arrafele) találhatóak. Mivel egy esetleges upgrade ezeket a file-okat fölülírja, másoljuk át őket magunknak:
cp -r /usr/share/openvpn/easy-rsa/2.0/ /etc/openvpn/easy-rsa

Lépjünk be ebbe a könyvtárba, nyissuk meg a "vars" nevü file-t, és írjuk át a KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL bejegyzéseket a megfelelőre (hehe).
Adjuk ki a következő parancsokat:
./vars
source vars
./clean-all
./build-ca

Ennek faszán le kell futnia, miközben a ./keys könyvtárban létrejön a ca.crt és a ca.key file, vagyis megcsináltuk a Certificate Authority-t.

Most jön a kulcs a szerverhez:
./build-key-server server

Ez kér egy jelszót. Adjuk meg és ne felejtsük el!
Csomó új file létrejön a keys könyvtárban :)
Majd ez:
./build-dh

ami létrehozza a dh1024.pem file-t ami kell (mindegy, hogy miért, én sem tudom. :))

Ezzel megvannak a key file-jaink a SZERVERHEZ. Mielőtt továbblépnénk a tényleges konfigurációra, készítsünk legalább egy kliens kulcsot is! Ezt lehet jelszóval és jelszó nélkül. Maradjunk a jelszavas verziónál:
./build-key-pass client-1

A client-1 lesz az első kliensünk. Minden kliensnek egyedi név (file) kell!

Közbevetés: a .key file-oknak titkosnak kell lenniük (mondjuk root jog és csak olvasható). Ellenben a .crt file-okat nem kell (ennyire) védeni.


Na eddig egész jók vagyunk! Már csak egy server.conf kell a VPN szerver bekonfigurálásához! Egy ilyen egyszerű elég:
port 1194
proto udp
dev tap0
ca "/etc/openvpn/easy-rsa/keys/ca.crt"
cert "/etc/openvpn/easy-rsa/keys/server.crt"
key "/etc/openvpn/easy-rsa/keys/server.key"  # Titkos!
dh "/etc/openvpn/easy-rsa/keys/dh1024.pem"
server-bridge 192.168.1.10 255.255.255.0 192.168.1.200 192.168.1.254
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
max-clients 10
persist-key
persist-tun
status openvpn-status.log
verb 4


Közbevetés: a server-bridge segítségével a bejövő VPN klienseket "becsatoljuk" a belső IP tartományba, 200-tól 254-ig. Fontos, hogy a DHCP szerverünket (router) úgy állítsuk be, hogy ne osszon IP-t ebbe a tartományba!
A részletekről az OpenVPN-HowTo-ban tessék olvasni.

Elindíthatjuk a VPN szervert:
/etc/rc.d/init.d/openvpn start


Debug célokra egyébként inkább így:
openvpn /etc/openvpn/server.conf


Elvileg ennek mennie is kell. Ha valami gáz van, a /var/log/messages -ben (vagy az orrunk előtt, ha interaktívan indítottuk) elvileg látjuk, mi a baj. Javítsuk meg! :)

Megjegyzés: előfordul, hogy az openvpn indítás "FAILED" üzenetet ad és mégis elindul. Ez nem tudom miért van, de nem is érekel, mert megy :)

Adjuk ki az "ifconfig" parancsot, és elvileg valami ilyet látunk:
br0       Link encap:Ethernet  HWaddr 00:19:20:90:B4:22  
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:69486 errors:0 dropped:0 overruns:0 frame:0
          TX packets:48783 errors:0 dropped:0 overruns:0 carrier:0

eth0      Link encap:Ethernet  HWaddr 00:19:20:90:B4:22  
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:69519 errors:0 dropped:0 overruns:0 frame:0
          TX packets:48769 errors:0 dropped:0 overruns:0 carrier:0

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:6362 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6362 errors:0 dropped:0 overruns:0 carrier:0

tap0      Link encap:Ethernet  HWaddr 00:FF:30:82:85:C5  
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:9650 overruns:0 carrier:0


Bingó! Már "csak" a klienseket kell beállítani!

5. OpenVPN kliens beállítás - Linux

Installáljuk az OpenVPN-t a kliensre is. Ezután itt elég lesz csupán két dolog:
- átmásolni a ca.crt file-t és a saját kulcsunkat (client1.crt,client1.key) amit a szerveren generáltunk
- az OpenVPN kliens config file-t létrehozni, az openvpn-t indítani

A kliens konfig (/etc/openvpn/client.conf):
client
dev tap
proto udp
remote example.dyndns.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca "/etc/openvpn/easy-rsa/keys/ca.crt"
cert "/etc/openvpn/easy-rsa/keys/client1.crt"
key "/etc/openvpn/easy-rsa/keys/client1.key"
comp-lzo
verb4


Inítsuk el:
openvpn /etc/openvpn/client.conf


Elvileg már pingelhetjük a becsatolt kliensen át a távoli hálózat belső gépeit, és akár a Windows share-eket is elérjük!
 

A bejegyzés közvetlen címe : http://fagzal.kepeslap.com/blog/b237

Hozzászólások

Új hozzászólás

Ha hozzá akar szólni a bejegyzéshez, lépjen be, vagy ha még nem regisztrált, regisztráljon itt!


Át a galériára!»

1. VPN beállítása Linuxon (Fedora + OpenVPN)
   2008, Április 2., 11h
2. E!
   2007, November 12., 23h
3. Végjáték
   2007, Szeptember 27., 1h
4. A devizahitel szépségei
   2007, Augusztus 10., 12h
További bejegyzések
1.-  11.-   21.-   31.-  

Archivum
rss newsfeed icon

Több képeslapküldő!
Cím: Első tavaszi virágok...
: 4903
: