Gmorks Wiki
Návody

OpenVPN

Dneska si ukážeme dvě základní možnosti provázání dvou nebo více sítí pomocí démona OpenVPN. OpenVPN je plně rozsáhlá SSL VPNka? s bohatou možností konfigurace.

OpenVPN je velmi kvalitní a spolehlivý software, který umožnuje prakticky neomezenou a snadnou konfiguraci. Poskytuje výbornou dokumentaci. Ukážeme si příklad asi nejběžnější: propojíme dvě sítě pomocí VPNky? + jeden z routerů bude sloužit jako hlavní server ( bude možné do naší VPNky? se dvěma sítěmi připojit další libovolné klienty třeba i z cizích sítí s možností vzájemného propojení všech klientů )

Nyní přístoupíme k samotné konfiguraci. Instalaci OpenVPN snad nemusím zmiňovat, je snadná a bezproblémová.

Začneme konfigurací na routeru A (hlavní - z pohledu VPN). Veškeré konfigurační soubory ukládáme do adresáře /etc/openvpn, bude se jednat o:

  • server.conf - soubor s hlavní konfigurací
  • ca.crt - autorizační, námi vygenerovaný certifikát (mají všichni klienti stejný)
  • client.crt - certifikát klienta (v našem případě router B - certifikát MUSÍ být umístění na obou routerech)
  • client.key - klíč klienta (platí pro něj stejná pravidla, jako pro client.crt)

VPNku? lze spojit třemi způsoby:

  • nešifrovaně - to asi nechceme
  • šifrovaně sdíleným klíčem - jednoduché, rychlé
  • šifrovaně pomocí SSL certfikátů - tento způsob je nejlepším řešením

Jak vytvořit SSL certifikáty ? Já jsem pro moji distribuci (Slackware) kompiloval OpenVPN ze zdrojových kódů. Zdrojový balíček, stažený ze stránek projektu OpenVPN , obsahuje i jednoduché skripty na generování certifikátů. Použití je velmi snadné.

Stáhneme tedy balíček se zdrojovými kódy z Openvpn.net a rozbalíme. Uvnitř balíčku je adresář rsa. Tento adresář překopírujeme do /etc/openvpn. V adresáři rsa je soubor vars, který zeditujeme a zkontrolujeme nastavení cest . Úplně dole vyexportujeme nastavení, které se bude hodit na náš router:

# These are the default values for fields
# which will be placed in the certificate.
# Don’t leave any of these fields blank.
export KEY_COUNTRY=”CZ”
export KEY_PROVINCE=”Czech”
export KEY_CITY=”Mesto”
export KEY_ORG=”router.doma.cz”
export KEY_EMAIL=”postmaster@doma.cz”

Zaměníme proměnné, jak potřebujeme. Poté zadáme příkazy:


cd /etc/openvpn/rsa
source ./vars

Nyní vygenerujeme všechny certifikáty + ostatní soubory, které budeme potřebovat k šifrovanému spoji. K tomu se používá přikaz build-dh a pkitool:


./build-dh -> Vytvoří Diffie-Hellman parametry pro server SSL spojení.
./pkitool –initca -> Vytvoří root certifikát
./pkitool –server -> Vytvoří server certifikát a klíč
./pkitool client1 -> Vytvorí “client1″ certifikát a klíč
./pkitool client1 -> Vytvoří “client2″ certifikát a klíč

Všechny soubory se nám vytvoří v /etc/openvpn/rsa/keys a my je překopírujeme do /etc/openvpn.

Nyní máme připraveno všechno kromě posledního kroku, kterým je vytvoření serverového konfiguračního souboru. Obsah server.conf bude vypadat takto:

mode server #říká nám, žš se jedná o server
tls-server # o SSL server
keepalive 10 60 # pingy pro udržení NAT spojení
dev tun0 # jedná se o VPN v routing módu
port 1194 # standartní port OpenVPN
server 10.10.10.0 255.255.255.0 # VPN síť
ifconfig-pool-persist /etc/openvpn/ipp.txt # Zajistí aby VPN klienti dostávali pořád stejnou VPN ip adresu
dh dh1024.pem # vygenerovaný souboe pomocí build-dh
ca ca.crt # vygenerováno pomocí pkitool
cert server.crt # vygenerováno pomocí pkitool
key server.key # vygenerováno pomocí pkitool
push “route 192.168.1.0 255.255.255.0″ # Dej k dispozici klientům LAN síť co je za serverem VPN (router A)
route-up “route delete -net 10.10.14.0/24″ # nahod routu VPNky
route-up “route add -net 10.10.14.0/24 tun0″ # nahod routu VPNky
client-config-dir ccd # nastavení informací IP o klientech (vytvořte: mkdir /etc/openvpn/ccd)
route 192.168.3.0 255.255.255.0 # nastavení routy na dosažení klientů z LAN na routeru A do LAN na router B - DULEZITE !
client-to-client # Klienti VPNky se mohou videt mezi sebou
persist-key
persist-tun
log-append /var/log/openvpn
status /var/log/openvpn-status
verb 3 # úroveň logování

Tak a to je na serveru VPN (router A) vše Cool. Nyní jen stačí nahodit VPNku? pomocí skriptu:

#!/bin/sh
# A sample OpenVPN startup script
# for Linux.

# openvpn config file directory
dir=/etc/openvpn

openvpn –cd $dir –daemon –config server.conf

a sledovat log, zda je vše OK

tail -f /var/log/openvpn

Můžeme pokračovat konfigurací klienta (router B). U klienta potřebujeme jen 4 soubory do /etc/openvpn adresáře. A ty jsou:

  • client.conf - konfigurace klienta
  • ca.crt - certifikát ze serveru - bezpečně dopravit na router B
  • client.crt - certifikát klienta ze serveru - bezpečně dopravit na router B
  • client.key - klíč klienta ze serveru - bezpečně dopravit na router B

client.conf bude vypadat takto:

port 1194 # defaultně na UDP - lepší výkon
dev tun0
mssfix 1500 # velikost MTU
remote VEREJNA_IP_SERVERU # Hooodně důležitý parametr …
tls-client # SSL klient
ns-cert-type server # autorizace
ca ca.crt
cert client.crt
key client.key
persist-key
persist-tun
pull # vezmi si VEŠKERÁ nastavení ze serveru
verb 3

Než klienta nahodíme a spojíme naši VPNku?, tak ještě musíme nastavit firewall. Nejprve však několik malých detailů, kterých jste si možná sami všimli.

  • konfigurační soubor pro všechny klienty je úplně identický (díky volbě “pull”)
  • klienti NEMUSÍ mít veřejnou IP adresu !
  • klienti mohou být schovaní za NATem? - OpenVPN je to úplně jedno (tedy jednodušší než IPsec?)
  • pokud připojíme dalšího VPN klienta z internetu (jako na našem schématu 10.10.10.100) a chceme, aby měl možnost dostat se i na LAN klienty routeru B, musíme do jeho konfigurace client.conf zadat: route 192.168.3.0 255.255.255.0

Jak jsem se už zmínil, je ještě nutné otevřít příslušné porty na firewallu - vlastně port … Zbývá povolit virtuální tap zařízení. Málem bych zapomněl, že podporu tun/tap musíte mít samozřejmě i v jádru. Pro jistotu si moduly nahrajeme s firewallem, takže:

# OpenVPN
# eth0 = vnější interface, WAN
modprobe tun
iptables -A INPUT -i eth0 -p udp –dport 1194 -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i eth0 -p udp –dport 1194 -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
# pokud omezujete i tok dat z LAN do WAN, tak:
iptables -A FORWARD -o eth0 -p udp –dport 1194 -j ACCEPT
iptables -A FORWARD -o tun+ -j ACCEPT

Nyní už nám nebrání opravdu nic v našem SSL spoji a můžeme na klientovi (router B) spustit:

#!/bin/sh
# A sample OpenVPN startup script
# for Linux.

# openvpn config file directory
dir=/etc/openvpn

openvpn –cd $dir –daemon –config client.conf

V logách pak uvidíme ověřování certifikátů, nahazování rout a neměl by být problém pingat z routeru B do LAN sítě routeru A a opačně.