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ě.