OpenVPN debian router/server és windows kliens


Szakmai szekció


Ismét egy szép probléma jött szembe.

A feladat, hogy egy meglévő céges hálózatba távolról Windows-os klienssel be lehessen lépni vpn alapokon és a Samba alatti hálózati kiszolgálókat látni lehessen. Mivel jómagam debian alapú szerverekkel foglalkozom, ennek a leírását teszem közzé.

A felépítés a céges hálózati oldalon:
WAN - Router/Firewall (debian alapú önálló gép) - Belső szerverek a hálózaton

Kliens oldal:
Windows alapú kliens gép internet kapcsolattal (Ez lehet önálló közvetlen pl.: WinDSL, lehet Hotspot mobilon keresztül, illetve lehet tűzfal mögött valamilyen hálózatban, ha ott a kívánt portok nyitva vannak.)

Kezdjük a céges hálózat oldalán!

Ahol teendőnk van az a router/firewall szerver, a belső hálózat többi szerverével nincs dolgunk.
Tehát a router/firewall gépen felépítjük az openvpn-t a következők szerint.

apt-get update

Ez frissíti a csomagtelepítőt, fontos, mert lehet, hogy függőséget is telepít, amit egy elavult adatbázissal már nem tudna.

apt-get install openvpn

Ekkor letölti és telepíti az OpenVPN csomagot.

Debian alatt a csomag a /usr/share/doc/openvpn könyvtár alá települ, meg még sok helyre.
Ahhoz hogy szóra bírjuk van több dolgunk is.

Lépjünk be a /usr/share/doc/openvpn/examples/easy-rsa/2.0 könyvtárba, majd hozzunk létre egy keys nevű könyvtárat, ide fogja elkészíteni a tanúsítványokat a rendszer.

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
md keys

A vars nevű file tartalmazza a kulcsokhoz szükséges információkat, erről készítsünk másolatot, mondjuk vars.orig néven.

cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/vars /usr/share/doc/openvpn/examples/easy-rsa/2.0/vars.orig

A vars nevű file-t nyissuk meg szerkesztésre (mc, vim, stb.), majd ballagjunk a végére és a következő változókat állítsuk be saját kedvünkre:

KEY_SIZE=1024 # ez itt a default, de felemelhetjük 2048-ra is
KEY_COUNTRY="HU" # Ország rövidítése
KEY_PROVINCE="PEST" # Viccelődünk egy kicsit, hogy Pest lesz a provincia
KEY_CITY="Ezavarosunk" # ide jön a városunk neve
KEY_ORG="KukutyinKft" # a szervezet neve
KEY_EMAIL="info@kukutyin.net" # cég e-mail címe

Mentsük el, majd exportáljuk:

source ./vars

Az korábbi tanúsítványokat töröljük, emígyen:

./clean-all

Generáljuk a CA tanúsítványt! ./build-ca

Nem kell megijedni a következő kérdésekre fog választ kérni:

Generating a 1024 bit RSA private key
........++++++
......++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [HU]:
State or Province Name (full name) [PEST]:
Locality Name (eg, city) [Ezavarosunk]:
Organization Name (eg, company) [KukutyinKft]:
Organizational Unit Name (eg, section) []:HEAD
Common Name (eg, your name or your server's hostname) [KukutyinKft CA]:kukutyin-gw
Name []:jozsi
Email Address [info@kukutyin.net]:

A vars lista alapján megadott értékeknél felkínálja az általunk megadott értékeket, de továbbiakat kérdez.
Igen, ez lesz majd a kérdés, hogy miután a vars-ban megadtuk a változókat, akkor még miket kérdez!

Az Organizational Unit Name: Itt HEAD-et adtam, merthogy az a főnökség, de lehet más is.
Common Name (eg, your name or your server's hostname) [KukutyinKft CA]: kukutyin-gw ha mondjuk a routerünk hostneve kukutyin-gw
Name: Megadhatunk egy nevet, én éppen a jozsit adtam. Az ékezeteket, ha lehet kerüljük.

Ezt követően generáljuk a server kulcsot.

./build-key-server kukutyinkft

Erre ez a válasz jön majd:

Generating a 1024 bit RSA private key
..........................++++++
............................++++++
writing new private key to 'generisk.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [HU]:
State or Province Name (full name) [PEST]:
Locality Name (eg, city) [Budapest]:
Organization Name (eg, company) [KukutyinKft]:
Organizational Unit Name (eg, section) []:HEAD
Common Name (eg, your name or your server's hostname) [generisk]:kukutyin-gw
Name []:jozsi
Email Address [info@kukutyin.net]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'HU'
stateOrProvinceName :PRINTABLE:'PEST'
localityName :PRINTABLE:'Budapest'
organizationName :PRINTABLE:'KukutyinKft'
organizationalUnitName:PRINTABLE:'HEAD'
commonName :PRINTABLE:'kukutyin-gw'
name :PRINTABLE:'jozsi'
emailAddress :IA5STRING:'iroda@kukutyin.net'
Certificate is to be certified until Feb 28 14:53:00 2025 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

A válaszok egyértelműek, és ne adjunk jelszót.

Ezt követi a Diffie-Hellman PEM kulcs:

./build-dh

Ennek ez lesz a kimenete:

Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.......+........+....................................+.............+.+..........+......................................+.............................................+...............................................................................................................................................................+.......................................................+......+......+..........+................................................................+......................................................................................................................+..........+......................................+..................................+...............+.......................................................+................+........+..............................................+....................+.............................................................................................................+...+........................................+.......................................................................................................................................................................................................................................................+.....................................+...........................................................+.............+.....................................................+........+.....+................................................+...............................................................................+................................................+...................................................+....+.+.................................................+..+............+................+..................................+.........................+...........................................................................+...........+..+......................................+........+........................................................+.....................................++*++*++*

Ezek után jön a kliens oldali kulcs. Legyen a kliens oldali kulcs neve: jozsi

./build-key jozsi

Fontos, itt a bekért adatoknál figyelni kell!
Ugyanis Common Name-nél egy kliens nevet kell adni. Maga a kulcs is ezen a néven jön létre. Annyi ilyet kell készíteni, ahány kliensről akarjuk elérni a hálózatot kívülről.
Lássuk:

Generating a 1024 bit RSA private key
...++++++
...................................++++++
writing new private key to 'jozsi.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [HU]:
State or Province Name (full name) [PEST]:
Locality Name (eg, city) [Budapest]:
Organization Name (eg, company) [KukutyinKft]:
Organizational Unit Name (eg, section) []:HEAD
Common Name (eg, your name or your server's hostname) [jozsi]:
Name []:
Email Address [info@kukutyin.net]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'HU'
stateOrProvinceName :PRINTABLE:'PEST'
localityName :PRINTABLE:'Budapest'
organizationName :PRINTABLE:'KukutyinKft'
organizationalUnitName:PRINTABLE:'HEAD'
commonName :PRINTABLE:'jozsi'
emailAddress :IA5STRING:'info@kukutyin.net'
Certificate is to be certified until Feb 28 14:55:18 2025 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Ez követően az elkészült kulcsokat a következőképpen kell elhelyezni:

Az /etc/openvpn könyvtárban szükség lesz a:
ca cert
ca key
dh1024.pem
kukutyinkft.crt
kukutyinkft.csr
kukutyinkft.key

kulcsokra, kéretik ide bemásolni őket.

Mentsük ki pendrive-ra a következő kulcsokat:

jozsi.crt
jozsi.csr
jozsi key
ca.cert
ca.key

Ezek szükségesek lesznek a kliens oldalon. (Ha lehet, ne e-mailben küldjük!)

A /etc/openvpn könyvtárban hozzunk létre egy ipp.txt file-t, ide fogja írni az openvpn írni a kiosztott ip-ket.

touch /etc/openvpn/ipp.txt

A /var/log könyvtárban hozzunk létre egy openvpn könyvtárat, ide fogja írni az openvpn írni a logjait.

md /var/log/openvpn

A /etc/openvpn könyvtárba másoljuk át a server.conf példa állományt a /usr/share/doc/openvpn/examples/sample-config-files könyvtárból és nyissuk meg szerkesztésre!

A server.conf állomány tartalma a következő a /etc/openvpn alatt

port 1194
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/kukutyinkft.crt
key /etc/openvpn/kukutiynkft.key # This file should be kept secret
dh /etc/openvpn/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.1.0 255.255.255.0" # Itt feltételeztük, hogy a lokális hálózat a 192.168.1.0-án van, tehát ha más, akkor kéretik megfelelően módosítani!
keepalive 10 120
comp-lzo
max-clients 100
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log # státuszlog
log-append /var/log/openvpn/openvpn.log # folyamatok logja, nagyon fontos, főleg az elején, itt jól láthatók a kapcsolatfelvételek.
verb 9 # Induláskor hasznos, mert egyébként nagyon csöndben van, ha már minden működik, akkor állítsuk át verb 3-ra!
mute 20

A tűzfal beállításokba egy kicsit bele kell nyúlni. Itt csak tájékoztatás szintjén, ami tényleg szükséges, a megadott tűzfal NEM TELJES!!!!

echo 1 >/proc/sys/net/ipv4/ip_forward

modprobe ip_conntrack_ftp
modprobe ip_conntrack
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp

iptables -F
iptables -t nat -F

iptables -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE # a tun interface natolása
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT # a belső hálózat FORWARD, a példámban a belső hálózat a 192.168.1.0
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE # az eth1 a külső interface, a hálózat natolása


Madj egy openvpn újraindítás.

/etc/init.d/openvpn restart



Jöjjön a Windows-os kliens!

Itt aránylag már egyszerű a dolog, mert az openvpn oldaláról le kell tölteni a windows-os csomagot és installálni.
A rendszer a C:/Program Files/OpenVPN könyvtárba akarja helyezni. Hagyjuk, mert ha máshova akarjuk rakni, akkor az installer eltéved!
A csomag egyébként nem nagy.
A C:/Program Files/OpenVPN/config alatt találjuk meg a client.ovpn file-t ami segít megérteni a konfigurációt. Ebbe a könyvtárba másoljuk be a korábban már említett állományokat, ezek:

jozsi.crt
jozsi.csr
jozsi key
ca.cert
ca.key

Ezt követően hozzunk létre egy jegyzettömb alkalmazással egy jozsi.ovpn file-t a következő tartalommal:

client
dev tun
dev-node MyTAP # Erről még fogok írni! Fontos
proto udp
remote XXX.XXX.XXX.XXX 1194 # ez céges hálózat külső IP címe, lehet domain nevet is használni, ha van, egyéb esetekben a dinamikus domain is működik, dyndns és társaik. A 1194 a port címe
resolv-retry infinite
nobind
persist-key
ca ca.crt # a config könyvtárba bemásolt kulcsok nevei
cert jozsi.crt
key jozsi.key
comp-lzo
verb 3

A MyTAP-ról azt kell tudni, hogy az OpenVPN installáláskor létrehoz egy TAP interface-t. A Vezérlőpult - Hálózati Eszközök alatt megtalálható. Azonban a Window maga kedvére nevezi el és ezt át kell nevezni a példában MyTAP-ra.
Egyébként nem találja meg és nem működik.

Ezután elvileg minden megy.

Remélem segítettem.