Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
openvpn_server [2012/07/27 16:34]
Ubuntu
openvpn_server [2019/02/25 18:20] (aktuální)
Řádek 1: Řádek 1:
 +====== OpenVPN server ======
  
 +|{{.:​iconCircle.png}} Návod navazuje na [[Linuxtero]]{{.:​IconHandPointing.png}}|
 +
 +**[[http://​wiki.ubuntu.cz/​OpenVPN%20server#​Krok_za_krokem|Článek]] obsahuje chyby. Spodní [[http://​wiki.ubuntu.cz/​OpenVPN%20server#​Skript|skript]] má fungovat dobře**
 +
 +===== Literatura =====
 +  * http://​www.root.cz/​clanky/​jak-na-openssl/​
 +  * http://​www.root.cz/​clanky/​openvpn-vpn-jednoduse/​
 +  * http://​openvpn.net/​index.php/​documentation/​howto.html#​examples
 +  * http://​www.czela.net/​wiki/​index.php/​OpenVPN
 +  * http://​openvpn.net/​index.php/​open-source/​documentation/​howto.html#​examples
 +
 +===== Krok za krokem =====
 +
 +
 +  * Instalace programů (server - klienti):
 +<​code>​
 +apt-get install openvpn openssl
 +</​code>​
 +
 +  * Pro generování certifikátů pro uživatele je potřeba vytvořit certifikační autoritu. Certifikační autorita (v tomto případě server) zajišťuje důvěryhodnost připojení uživatelů k serveru. V první řadě vytvoříme adresář pro certifikační autoritu a potřebné podadresáře:​
 +<​code>​
 +cd /etc/ssl/
 +mkdir demoCA demoCA/​certs demoCA/crl demoCA/​newcerts demoCA/​private
 +</​code>​
 +
 +
 +  * Nyní je třeba ještě vytvořit prázdný soubor index.txt a soubor serial s obsahem „01“:
 +<​code>​
 +touch /​etc/​ssl/​demoCA/​index.txt
 +echo 01 > /​etc/​ssl/​demoCA/​serial
 +</​code>​
 +
 +  * Dále vygenerujeme certifikát certifikační autority a podepíšeme jej sám sebou:
 +<​code>​
 +cd /​etc/​ssl/​demoCA
 +openssl req -new -x509 -nodes -out cacert.pem -keyout cakey.pem -days 3650
 +</​code>​
 +
 +  * Následně umístíme vygenerovaný klíč a certifikát do správných adresářů. Certifikát přesuneme do /​etc/​ssl/​demoCA a klíč do /​etc/​ssl/​demoCA/​private. Klíč by měl být právy ochráněn před neoprávněnou manipulací,​ změňíme práva na 400 (chmod 400 cakey.pem):
 +<​code>​
 +mv cacert.pem certs/ && mv cakey.pem private/
 +chmod 400 private/​cakey.pem
 +</​code>​
 +
 +
 +  * Správnost cest je třeba ještě jednou zkontrolovat v konfiguračním souboru programu openssl nacházející se v „/​etc/​ssl/​openssl.cnf“ v sekci „[ CA_default ]“. Defaultní nastavení souboru je následující:​
 +<​code>​
 +[ CA_default ]
 +
 +dir             = ./​demoCA ​           # Kořenový adresář CA
 +certs           = $dir/​certs ​           # Adresář obsahující vydané certifikáty
 +crl_dir ​        = $dir/​crl ​             # Adresář obsahující CRL
 +database ​       = $dir/​index.txt ​       # Index databáze
 +
 +new_certs_dir ​  = $dir/​newcerts ​        # Adresář pro nové certifikáty
 +
 +certificate ​    = $dir/​certs/​cacert.pem ​      # Certifikát CA
 +serial ​         = $dir/​serial ​          # Soubor se sérií certifikátů (počítá)
 +
 +crl             = $dir/​crl/​crl.pem ​         # Aktuální CRL
 +private_key ​    = $dir/​private/​cakey.pem#​ Soukromý klíč CA
 +RANDFILE ​       = $dir/​private/​.rand ​   # Soubor pro generování náhodných čísel
 +
 +policy ​         = policy_anything ​      # Politiku certifikátů zvolíme volnou
 +</​code>​
 +
 +
 + :!: Pokud z nějakého důvodu nefungují relativní cesty pomocí "​$dir",​ je třeba je zadat staticky. (Chyba vzniká v bodu 8)
 +
 +
 +<​code>​
 +[ CA_default ]
 +
 +dir = /​etc/​ssl/​demoCA #​ Where everything is kept
 +certs = /​etc/​ssl/​demoCA/​certs #​ Where the issued certs are kept
 +crl_dir = $dir/crl # Where the issued crl are kept
 +database = /​etc/​ssl/​demoCA/​index.txt #​ database index file.
 +#​unique_subject = no # Set to '​no'​ to allow creation of
 + # several ctificates with same subject.
 +new_certs_dir = /​etc/​ssl/​demoCA/​newcerts #​ default place for new certs.
 +
 +certificate = /​etc/​ssl/​demoCA/​certs/​cacert.pem # The CA certificate
 +#​certificate = $dir/​cacert.pem # The CA certificate
 +serial = /​etc/​ssl/​demoCA/​serial # The current serial number
 +crlnumber = $dir/​crlnumber #​ the current crl number
 + # must be commented out to leave a V1 CRL
 +crl = $dir/​crl.pem # The current CRL
 +private_key = /​etc/​ssl/​demoCA/​private/​cakey.pem#​ The private key
 +RANDFILE = $dir/​private/​.rand #​ private random number file
 +
 +x509_extensions = usr_cert # The extentions to add to the cert
 +
 +# Comment out the following two lines for the "​traditional"​
 +# (and highly broken) format.
 +name_opt = ca_default #​ Subject Name options
 +cert_opt = ca_default #​ Certificate field options
 +
 +# Extension copying option: use with caution.
 +# copy_extensions = copy
 +
 +# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
 +# so this is commented out by default to leave a V1 CRL.
 +# crlnumber must also be commented out to leave a V1 CRL.
 +# crl_extensions = crl_ext
 +
 +default_days = 365 # how long to certify for
 +default_crl_days= 30 # how long before next CRL
 +default_md = sha1 # which md to use.
 +preserve = no # keep passed DN ordering
 +
 +# A few difference way of specifying how similar the request should look
 +# For type CA, the listed attributes must be the same, and the optional
 +# and supplied fields are just that :-)
 +policy = policy_anything
 +</​code>​
 +
 +  * Pokud je již všechno správně nastaveno, lze začít generovat certifikáty. Vygenerujeme ho tedy pro server.
 + :!: Při vyplňování parametrů je nutné zadat stejné parametry uvedené v sekci [ policy_match ] v konfiguračním souboru „/​etc/​ssl/​openssl.cnf“.
 + :!: match = má se rovnat (pro countryName vyplnuji vzdy "​CZ"​)
 + :!: optional = nemusí se vyplnovat
 + :!: supplied = asi se musi vyplnovat, napriklad IP nebo jmeno (kazdy certifikat uniq?)
 +
 +
 +<​code>​
 +mkdir server && cd server
 +openssl req -new -nodes -out request.pem -keyout key.pem -days 1095
 +</​code>​
 +
 +  * Z předchozího příkazu dostaneme dva soubory (žádost „request.pem“ a klíč „key.pem“). Následně potvrdíme certifikační autoritou žádost o vydání certifikátu:​
 +<​code>​
 +openssl ca -in request.pem -out cert.pem
 +</​code>​
 +
 +
 + :!: Zde může nastat problém popsaný v bodě 6!
 +
 +
 +<​code>​
 +# Chyba
 +openssl ca -in request.pem -out cert.pem
 +Using configuration from /​usr/​lib/​ssl/​openssl.cnf
 +Error opening CA certificate ./​demoCA/​cacert.pem
 +17226:​error:​02001002:​system library:​fopen:​No such file or directory:​bss_file.c:​352:​fopen('​./​demoCA/​cacert.pem','​r'​)
 +17226:​error:​20074002:​BIO routines:​FILE_CTRL:​system lib:​bss_file.c:​354:​
 +unable to load certificate
 +</​code>​
 +<​code>​
 +# Dobře
 +openssl ca -in request.pem -out cert.pem
 +Using configuration from /​usr/​lib/​ssl/​openssl.cnf
 +Check that the request matches the signature
 +Signature ok
 +Certificate Details:
 + ...
 + ... výpis detailů ceritifikátu
 + ...
 +Certificate is to be certified until Nov 18 11:27:39 2010 GMT (365 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
 +</​code>​
 +
 +  * Zkopírujeme soubory na patřičná místa na serveru
 +<​code>​
 +mv cert.pem /​etc/​openvpn/​cert.pem
 +mv key.pem /​etc/​openvpn/​key.pem
 +</​code>​
 +
 +
 +  * Nyní vytvoříme certifikát pro uživatele, a potvrdíme certifikační autoritou:
 +<​code>​
 +mkdir client && cd client
 +openssl req -new -nodes -out request.pem -keyout key.pem -days 1095
 +openssl ca -in request.pem -out cert.pem
 +</​code>​
 +
 +
 +  * Po úspěšném provedení předchozího příkazu dostáváme certifikát potvrzený certifikační autoritou. Tímto způsobem vytvoříme certifikát pro server a klienty. Bezpečnou cestou přeneseme klíč , certifikát a certifikát certifikační autority do počítačů. Dále je třeba vytvořit soubor s Diffie-Hellmann algoritmem (více o DH na: http://​www.algoritmy.net/​article/​84/​Diffie-Hellman)
 +<​code>​
 +openssl dhparam -out /​etc/​ssl/​demoCA/​dh1024.pem 1024
 +</​code>​
 +
 +
 +  * V serveru vytvoříme konfigurační soubor pro připojení virtuální sítě. Konfigurační soubor vytvoříme v  „/​etc/​openvpn/​vpn_server.conf“. Soubor bude obsahovat následující kód:
 +<​code>​
 +mode server
 +tls-server
 +dev tap0
 +port 1194
 +
 +ifconfig 10.0.1.1 255.255.255.0
 +ifconfig-pool 10.0.1.100 10.0.1.200 255.255.255.0
 +duplicate-cn
 +proto udp
 +
 +ca /​etc/​ssl/​demoCA/​certs/​cacert/​cacert.pem
 +cert /​etc/​openvpn/​cert.pem
 +key /​etc/​openvpn/​key.pem
 +dh /​etc/​ssl/​demoCA/​dh1024.pem
 +
 +log-append /​var/​log/​openvpn
 +status /​tmp/​vpn.status 10
 +
 +user root
 +group root
 +comp-lzo
 +verb 3
 +
 +keepalive 1 220
 +</​code>​
 +
 +
 +  * V počítači klienta vytvoříme konfigurační soubor pro připojení virtuální sítě. Editujeme soubor „/​etc/​openvpn/​vpn_client.conf“ a doplníme správné údaje pro připojení:​
 +<​code>​
 +remote 1.2.3.4 ### IP adresa serveru
 +tls-client
 +dev tap
 +pull
 +
 +mute 10
 +ca /​etc/​openvpn/​cacert.pem
 +cert /​etc/​openvpn/​cert.pem
 +key /​etc/​openvpn/​key.pem
 +
 +comp-lzo
 +verb 3
 +</​code>​
 +
 +
 +  * Nyní máme konfiguraci hotovou a lze ji vyzkoušet. Nejdříve spustíme vpn server „/​etc/​init.d/​openvpn start“. A dále použijeme nastavení pro otevření spojení:
 +<​code>​
 +cd /​etc/​openvpn
 +openvpn --config ./​vpn_client.conf
 +</​code>​
 +
 +
 + :!: Dostaneme vypis podobny tomuto:
 +<​code>​
 +OpenVPN 2.0.9 i486-pc-linux-gnu [SSL] [LZO] [EPOLL] built on May 21 2007
 +WARNING: No server certificate verification method has been enabled. ​ See http://​openvpn.net/​howto.html#​mitm for more info.
 +WARNING: file '​vpn.key'​ is group or others accessible
 +LZO compression initialized
 +Control Channel MTU parms [ L:1574 D:138 EF:38 EB:0 ET:0 EL:0 ]
 +Data Channel MTU parms [ L:1574 D:1450 EF:42 EB:135 ET:32 EL:0 AF:3/1 ]
 +Local Options hash (VER=V4): '​d79ca330'​
 +Expected Remote Options hash (VER=V4): '​f7df56b8'​
 +UDPv4 link local (bound): [undef]:​1194
 +UDPv4 link remote: 1.2.3.4:​1194
 +TLS: Initial packet from 1.2.3.4:​1194,​ sid=3810d946 e78ea6ad
 +VERIFY OK: depth=1, /​C=CS/​ST=Czech/​L=Plzen/​O=server/​OU=server/​CN=duckd/​emailAddress=duckd@email.cz
 +VERIFY OK: depth=0, /​C=CS/​ST=Czech/​L=Remote/​O=client/​OU=duckd/​CN=duckd/​emailAddress=duckd@email.cz
 +Data Channel Encrypt: Cipher '​BF-CBC'​ initialized with 128 bit key
 +Data Channel Encrypt: Using 160 bit message hash '​SHA1'​ for HMAC authentication
 +Data Channel Decrypt: Cipher '​BF-CBC'​ initialized with 128 bit key
 +Data Channel Decrypt: Using 160 bit message hash '​SHA1'​ for HMAC authentication
 +Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA,​ 1024 bit RSA
 +[duckd] Peer Connection Initiated with 1.2.3.4:​1194
 +SENT CONTROL [duckd]: '​PUSH_REQUEST'​ (status=1)
 +PUSH: Received control message: '​PUSH_REPLY,​ping 10,​ping-restart 220,​ifconfig 10.0.1.100 255.255.255.0'​
 +OPTIONS IMPORT: timers and/or timeouts modified
 +OPTIONS IMPORT: --ifconfig/​up options modified
 +TUN/TAP device tap0 opened
 +ifconfig tap0 10.0.1.100 netmask 255.255.255.0 mtu 1500 broadcast 10.0.1.255
 +Initialization Sequence Completed
 +</​code>​
 +
 +
 +  * Na serveru a clientu se lze přesvědčit že jsou vytvořeny zařízení. Příkaz: ifconfig, zařízení tap0. A měl by fungovat ping.
 +
 +
 +===== Skript =====
 +
 +  * Soubory na serveru:
 +      * vpn_server.conf ### Upravíme parametry připojení v konfiguračním souboru pro server
 +      * bash server_install.sh ### Pokud máme tyto dva soubory ve stejném adresáři, instalujeme openvpn na server. Výsledkem má být běžící openvpn server v terminálu.
 +      * server_generuj_certifikat.sh ### Generuj přístup jednomu klientovi a zabal do balíku /​etc/​ssl/​demoCA/​client_X.tar.
 +
 +
 +  * Soubory na klientovi:
 +      * vpn_client.conf ### Upravíme klientovo konfigurák\ ​
 +      * client_X.tar ### balík získáme ze serveru (bezpečnou cestou)\ ​
 +      * bash client_install.sh ### pokud máme tyto tři soubory ve stejném adresáři, instalujeme openvpn na klienta\ ​
 +
 +==== Server ====
 +  * vpn_server.conf
 +<​code>​
 +mode server
 +port 1194
 +proto tcp-server
 +tls-server
 +dev tap0
 +
 +ifconfig 10.0.1.1 255.255.255.0
 +ifconfig-pool 10.0.1.100 10.0.1.200 255.255.255.0
 +duplicate-cn
 +
 +ca /​etc/​openvpn/​cert/​cacert.pem
 +cert /​etc/​openvpn/​cert/​cert.pem
 +key /​etc/​openvpn/​cert/​key.pem
 +dh /​etc/​openvpn/​cert/​dh1024.pem
 +
 +log-append /​var/​log/​openvpn
 +status /​tmp/​vpn.status 10
 +
 +user root
 +group root
 +comp-lzo
 +verb 3
 +
 +keepalive 1 220
 +</​code>​
 +
 +
 +  * server_install.sh
 +<​code>​
 +
 +wd=`pwd`
 +
 +echo -e '​\E[31m 1) Instalace programů na server \033[0m'​
 +apt-get install -y openvpn openssl
 +
 +echo -e '​\E[31m 2) Vytvoříme adresář pro certifikační autoritu a potřebné podadresáře \033[0m'​
 +mkdir -p /​etc/​ssl/​demoCA/​{certs,​private,​crl,​newcerts}
 +
 +echo -e '​\E[31m 3) Vytvoříme prázdný soubor index.txt a soubor serial s obsahem 01 \033[0m'​
 +touch /​etc/​ssl/​demoCA/​index.txt
 +echo 01 > /​etc/​ssl/​demoCA/​serial
 +
 +echo -e '​\E[31m 4) Vygenerujeme certifikát certifikační autority a podepíšeme jej sám sebou \033[0m'​
 +cd /​etc/​ssl/​demoCA
 +openssl req -new -x509 -nodes -out cacert.pem -keyout cakey.pem -days 3650
 +
 +echo -e '​\E[31m 5) Umístíme vygenerovaný klíč a certifikát do správných adresářů \033[0m'​
 +chmod 400 cakey.pem
 +mv cakey.pem private/
 +
 +echo -e '​\E[31m 6) Vytvoříme soubor s Diffie-Hellmann algoritmem \033[0m'​
 +openssl dhparam -out dh1024.pem 1024
 +
 +echo -e '​\E[31m 7) Vytvoříme žádost o certifikát a klíč pro openvpn server \033[0m'​
 +cd /etc/ssl
 +openssl req -new -nodes -out request.pem -keyout key.pem -days 1095
 +
 +echo -e '​\E[31m 8) Žádost o certifikát potvrdíme a vydáme certifikát \033[0m'​
 +openssl ca -in request.pem -out cert.pem
 +rm request.pem
 +mv cert.pem demoCA/​certs/​
 +mv key.pem demoCA/​private/​
 +
 +echo -e '​\E[31m 9) Zkopírujeme potřebné soubory do adresáře s openvpn \033[0m'​
 +mkdir /​etc/​openvpn/​cert/​
 +cp /​etc/​ssl/​demoCA/​{cacert.pem,​certs/​cert.pem,​private/​key.pem,​dh1024.pem} /​etc/​openvpn/​cert/​
 +
 +echo -e '​\E[31m 10) Přesunem konfigurak \033[0m'​
 +cd $wd
 +cp vpn_server.conf /​etc/​openvpn/​vpn_server.conf
 +
 +echo -e '​\E[31m 11) Startujem :) \033[0m'​
 +/​etc/​init.d/​openvpn start
 +</​code>​
 +
 +
 +  * server_generuj_certifikat.sh
 +<​code>​
 +
 +cd /​etc/​ssl/​demoCA/​
 +
 +function generuj_certifikat
 +{
 +  openssl req -new -nodes -out request.pem -keyout key.pem -days 1095
 +  openssl ca -in request.pem -out cert.pem
 +  rm request.pem
 +  tar -cvf client_$number.tar key.pem cert.pem cacert.pem
 +  rm key.pem cert.pem
 +}
 +
 +for (( number=1 ; $number-1000 ; number=$number+1 ))
 +do
 +  if [ -f client_$number.tar ]
 +    then
 +      echo the file exists
 +    else
 +      generuj_certifikat
 +      exit
 +  fi
 +done
 +</​code>​
 +
 +  * Pokud chcete odebrat openvpn ze serveru včetně veškerých vytvořených soborů a adresářů
 +<​code>​
 +apt-get purge openvpn && rm -r /​etc/​openvpn/​ && rm -r /​etc/​ssl/​demoCA/​
 +</​code>​
 +
 +==== Klient ====
 +  * vpn_client.conf
 +<​code>​
 +remote 192.168.1.10 ### IP adresa serveru
 +dev tap
 +proto tcp-client
 +port 1194
 +tls-client
 +pull
 +
 +mute 10
 +ca cacert.pem
 +cert cert.pem
 +key key.pem
 +
 +comp-lzo
 +verb 3
 +</​code>​
 +
 +  * client_install.sh
 +<​code>​
 +
 +echo "1) Instalace programů na klienta"​
 +apt-get install -y openvpn openssl
 +
 +echo "​Přesunem konfigurak"​
 +mv vpn_client.conf /​etc/​openvpn/​vpn_client.conf
 +
 +echo "​Rozbalíme balík a pošleme *.pem soubory na správné místo"​
 +tar -xvf client_*.tar;​ mv *.pem /​etc/​openvpn/​
 +
 +echo "​Spustíme připojení klienta na server"​
 +openvpn --config /​etc/​openvpn/​vpn_client.conf
 +</​code>​
 +
 +===== Konec =====
 +{{.:​bug.png}}
 +  * **Vytvořil:​** [[http://​forum.ubuntu.cz/​index.php?​action=profile;​u=1009|DuckD]]
 +  * **Pomáhali a radili:** Krtko, fenquick, trako, lkopecky