Zobrazit stránkuStarší verzeZpětné odkazyUložit do PDFNahoru Tato stránka je pouze pro čtení. Můžete si pouze prohlédnout zdrojový kód, ale ne ho měnit. Zeptejte se správce, pokud si myslíte, že něco není v pořádku. ====== 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 Poslední úprava: 2019/02/25 18:20(upraveno mimo DokuWiki)