VPN (Virtual Private Network — soukromá virtuální síť) je užitečným pomocníkem v případech, kdy se potřebujete bezpečně připojit do domácí či firemní sítě z mnoha různých míst. Server může běžet na Linuxovém firewallu, klient pak na počítači s Windows. To vše je zadarmo a opensource.
Instalace potřebných balíčků
Pro OpenVPN server budeme potřebovat balíčky z repositáře RPMForge. Instalace repositáře je jednoduchá, například pro 64b CentOS 5:
rpm -Uhv http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
Po tomto kroku vřele doporučuji nastavit plugin balíčkovacího systému yum-priorities, není to ovšem nezbytně nutné. Nainstalujeme balíčky:
yum install openvpn lzo2
Vygenerování párů klíčů pro server a klienty
Prostředí pro vytváření klíčů je v adresáři /usr/share/doc/openvpn-2.0.9/easy-rsa/ (podle verze OpenVPN). Nejprve je nutné nastavit hodnoty v souboru vars ve stejném adresáři, například:
export KEY_SIZE=2048 export KEY_COUNTRY=CZ export KEY_PROVINCE=NA export KEY_CITY=Olomouc export KEY_ORG="MojeFirma a.s." export KEY_EMAIL="me@MojeFirma.example"
Vygenerování klíčů serveru
Tento krok je potřeba provést pouze jednou po instalaci. Při běžném používání se generují pouze klíče pro klienty.
Nejdříve je nutné do aktuálního prostředí zavést hodnoty ze souboru vars. Tento krok je potřeba učinit před každým generování klíčů (jak pro server, tak i pro klienty).
. ./vars
Po té úklid:
sh clean-all
Potom je možno vygenerovat certifikační autoritu (CA) pro následný podpis vygenerovaných klíčů. U položky common name je vhodné dát jednoznačné označení dané certifikační autority (jednu CA je možné použít pro mnoho serverů). Ostatní položky jsou předvyplněny dle položek souboru vars.
sh build-ca Generating a 2048 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) [CZ]: State or Province Name (full name) [NA]: Locality Name (eg, city) [Olomouc]: Organization Name (eg, company) [MojeFirma a.s.]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:VPNMojeFirma Email Address [me@MojeFirma.example]:
Potom vygenerovat klíč serveru. Položka common name by opět měla jednoznačně identifikovat daný server. Potom je možné zadat heslo (nezadávat, jinak by bylo nutné jej zadávat při každém spuštění OpenVPN serveru). A potvrdit hodnoty a podepsání klíče certifikační autoritou.
sh build-key-server server Generating a 2048 bit RSA private key writing new private key to 'server.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) [CZ]: State or Province Name (full name) [NA]: Locality Name (eg, city) [Olomouc]: Organization Name (eg, company) [MojeFirma a.s.]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:OpenVPN-Server-MojeFirma Email Address [me@MojeFirma.example]: 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-2.0.9/easy-rsa/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName PRINTABLE:'CZ' stateOrProvinceName PRINTABLE:'NA' localityName PRINTABLE:'Olomouc' organizationName PRINTABLE:'MojeFirma a.s.' commonName PRINTABLE:'OpenVPN-Server-MojeFirma' emailAddress IA5STRING:'me@MojeFirma.example' Certificate is to be certified until Sep 7 07:45:04 2020 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
Vygenerovat DiffieHelman parametry. Tato operace může trvat hodně dlouho, nevyžaduje však interakci uživatele.
sh build-dh Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time
Tímto je vygenerování souborů pro server hotovo.
Generování klíčů pro klienta
Nejběžnějším (a v podstatě jediným) úkolem při běhu OpenVPN serveru je generování klíčů pro klienty. Nejprve je nutné načíst hodnoty ze souboru vars v příslušném adresáři easy-rsa:
cd /usr/share/doc/openvpn-2.0.9/easy-rsa/ . ./vars
Pak už samotné generování klíč. Je vhodné si předem promyslet schéma pojmenovávání klíčů (pojmenování souborů a common name). Opět je možné nezadávat heslo.
sh build-key Jan_Novak Generating a 2048 bit RSA private key writing new private key to 'Jan_Novak.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) [CZ]: State or Province Name (full name) [NA]: Locality Name (eg, city) [Olomouc]: Organization Name (eg, company) [MojeFirma a.s.]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:Jan_Novak Email Address [me@MojeFirma.example]: 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-2.0.9/easy-rsa/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName PRINTABLE:'CZ' stateOrProvinceName PRINTABLE:'NA' localityName PRINTABLE:'Olomouc' organizationName PRINTABLE:'MojeFirma a.s.' commonName T61STRING:'Jan_Novak' emailAddress IA5STRING:'me@MojeFirma.example' Certificate is to be certified until Sep 7 07:59:53 2020 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
Tímto je generování klíčů hotové.
Nastavení serveru
Vytvoříme soubor /etc/openvpn/server.conf. Důležité parametry jsou port (standardně 1194) a protokol (standardně UDP).
Parametr server udává použitou IP pro server a masku sítě.
port 1194 proto udp dev tap ca /usr/share/doc/openvpn-2.0.9/easy-rsa/keys/ca.crt cert /usr/share/doc/openvpn-2.0.9/easy-rsa/keys/server.crt key /usr/share/doc/openvpn-2.0.9/easy-rsa/keys/server.key dh /usr/share/doc/openvpn-2.0.9/easy-rsa/keys/dh2048.pem server 10.8.0.0 255.255.255.0 keepalive 30 120 comp-lzo user nobody group nobody persist-key persist-tun status /var/log/openvpn/status.log log-append /var/log/openvpn/openvpn.log verb 3 mute 20
Více lze nalézt v dokumentaci k nastavení serveru.
Nastavení klienta
Vytvoříme soubor s nastavením klienta. Důležité je správně nastavit protokol a port (položka remote nastavuje OpenVPN server a port), toto nastavení bude společné pro všechny klienty.
Naopak je potřeba pro každého zvlášť nastavit jméno souboru s klíčem.
client dev tap proto udp remote vpn.domena.cz 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca ca.crt cert Jan_Novak.crt key Jan_Novak.key comp-lzo verb 3
Více v dokumentaci klienta.
Soubory
Klientovi dodáme nachystaný konfigurační soubor a také soubory s klíči.
ca.crt Jan_Novak.crt Jan_Novak.key
Soubor ca.crt je pro všechny klienty stejný. Naopak v žádné případě nesmí klient dostat klíč k CA a klíče ostatních klientů.
Tímto je nastavení OpenVPN serveru a klienta u konce. Pokud něco nefunguje, tak je to nejčastěji nesoulad v protokolu serveru a klienta, případně port. Potom je to často nesprávná kombinace ca.crt a klíčů (jak server, tak klient si pomocí certifikátu autority ověřuje klíč druhé strany).