Инструменты пользователя

Инструменты сайта


notes:openvpn:openvpn_erver_setup

На главную, Заметки


Настройка OpenVPN сервера

Это перепечатка статьи. Оригинал находится на сайте Скорая Компьютерная Помощь. Спасибо автору за хорошее изложение материала. Естественно все права (и лева) принадлежат автору.

OpenVPN — свободная реализация технологии Виртуальной Частной Сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT-firewall, без необходимости изменения их настроек. OpenVPN была создана Джеймсом Йонаном (James Yonan) и распространяется под лицензией GNU GPL.

В этой статье в простой и доступной форме мы попытаемся рассказать вам о том как поднять собственный OpenVPN сервер. Мы не ставим своей целью, чтобы по окончании прочтения этой статьи вы досконально понимали все принципы «как это работает» или разбирались в тонкостях организации сетей, но хотим, чтобы в результате - вы могли настроить OpenVPN сервер «с нуля». Так что можно считать эту статью неким пошаговым руководством для пользователей. На самом деле в сети масса документации, мануалов, посвященных развертыванию OpenVPN, но они либо ориентированы на подготовленных пользователей или системных администраторов, либо же в качестве примера для демонстрации используются Linux-системы. Мы же пойдем другим путем и расскажем как настроить OpenVPN на компьютере среднестатического пользователя, т.е. рабочей станции с установленной ОС Windows. Зачем вам может пригодиться эта информация? Ну например вы хотите поиграть с друзьями в игру, которая не поддерживает игру через интернет, а только по локальной сети, или же, например, вы занимаетесь удаленной поддержкой пользователей, но по каким-то причинам использовать программное обеспечение вроде TeamViewer или Ammyy Admin не желаете, т.к. не хотите чтобы в процессе передачи ваших данных или установки соединения участвовали сервера сторонних компаний. В любом случае практический опыт организации собственной виртуальной частной сети (VPN) окажется для вас полезным.

Настройка сервера

Итак, начнем. В нашем примере в качестве сервера OpenVPN будет выступать машина с установленной ОС Windows XP Professional SP3 (x86), в качестве клиентов - несколько машин с Windows 7 x64 и Windows 7 x86 (хотя на самом деле описываемая в статье схема заработает и на других конфигурациях). Предположим, что ПК который будет выступать в роли OpenVPN сервера имеет белый статический IP адрес в сети интернет (в случае если IP адрес, предоставляемый вашим провайдером динамический, то вам необходимо зарегистрироваться в DynDNS или No-IP), если это условие выполняется, но ПК находится за роутером или аппаратным firewall'ом - вам придется пробросить необходимые порты (об этом мы расскажем чуть ниже, когда перейдем непосредственно к настройке сервера), если вы не представляете что это такое и для чего это используется, то мы рекомендуем вам ознакомиться со статьей Port Forwarding. Как настроить и что это такое?

  1. Идем на официальный сайт проекта OpenVPN, в раздел Downloads - http://openvpn.net/index.php/open-source/downloads.html. Скачиваем оттуда, соответствующий вашему релизу ОС Windows дистрибутивай (32-bit или 64-bit Installer). На момент написания этой статье для 32-х битных ОС был доступен дистрибутив openvpn-install-2.3_rc1-I002-i686.exe, а для 64-х битных - openvpn-install-2.3_rc1-I002-x86_64.exe соответственно. Т.к. мы определились, что сервер мы будем поднимать на WinXP x86, т.е. на 32-битной ОС, то скачиваем дистрибутив по первой ссылке.
  2. Запускаем скачанный инсталлятор. На этапе где выбирается путь для установки вводим C:\OpenVPN (см. скриншот), это упростит нам настройку в дальнейшем: После чего нажимаем «Next» до тех пор, пока установка не будет завершена. Если в процессе установки, на этапе выбора компонент для установки у вас было «пустое окно», например, такое: То по всей видимости вы скачали «не тот» дистрибутив, в таком случае попробуйте скачать последнюю релизную версию openvpn-2.2.2-install.exe (она устанавливается как на x86, так и на x64 системы). При «правильной установке» окно выбора компонентов должно выглядеть так: Все галочки в нем при установке по-умолчанию стоят, менять дополнительно ничего не нужно. Если установка прошла успешно, то в Панели управления → Сетевые подключения (или, если вы устанавливаете сервер на Windows 7 или Windows Vista, в Центр управления сетями и общим доступом → Изменение параметров адаптера) у вас должен появиться TAP-Win32 Adapter V9, который будет называться «Подключение по локальной сети X» (X - автоматически присваиваемый системой номер): Состояние у него будет «Сетевой кабель не подключен», т.к. мы еще не конфигурировали наш сервер.
  3. Создаем в папке OpenVPN подпапку SSL, в ней будут храниться выданные сервером ключи и сертификаты. Далее запускаем блокнот и копируем в него следующий текст:
    #dev tun
    dev tap
    #dev-node "VPN"
    proto tcp-server
    #proto udp
    port 7777
    tls-server
    server 10.10.10.0 255.255.255.0
    comp-lzo
    # route-method exe
    # маршрут для сервера, чтобы видеть сети за клиентом
    # route 192.168.x.0 255.255.255.0 10.10.10.x
    # маршрут добавляемый в таблицу маршрутизации каждого клиента, чтобы видеть сеть за сервером
    # push "route 192.168.x.0 255.255.255.0"
    # разрешает vpn-клиентам видеть друг-друга, в противном случае все vpn-клиенты будут видеть только сервер
    client-to-client
    # каталог с описаниями конфигураций каждого из клиентов
    client-config-dir C:\\OpenVPN\\config\\ccd
    # файл с описанием сетей между клиентом и сервером
    ifconfig-pool-persist C:\\OpenVPN\\config\\ccd\\ipp.txt
    # пути для ключей и сертификатов сервера
    dh C:\\OpenVPN\\ssl\\dh1024.pem
    ca C:\\OpenVPN\\ssl\\ca.crt
    cert C:\\OpenVPN\\ssl\\Server.crt
    key C:\\OpenVPN\\ssl\\Server.key
    #persist-key
    tls-auth C:\\OpenVPN\\ssl\\ta.key 0
    tun-mtu 1500
    tun-mtu-extra 32
    mssfix 1450
    keepalive 10 120
    status C:\\OpenVPN\\log\\openvpn-status.log
    log C:\\OpenVPN\\log\\openvpn.log
    verb 3 

    На параметрах которые здесь описаны, мы остановимся чуть позже. После чего сохраняем его в файл C:\OpenVPN\Config\Server.ovpn, обратите внимание файл должен получиться именно с расширением .ovpn, для этого в диалоге сохранения опции должны стоять именно так, как показано на картинке: Если вы работаете под Windows 7 / Windows Vista и блокнот не дает вам сохранить файл Server.ovpn в папку C:\OpenVPN\Config\, значит его нужно запустить с правами администратора. Для этого щелкните в меню Пуск по ярлыку Блокнота правой кнопкой мыши и выберите «Запуск от имени администратора»: Теперь также с помощью блокнота создадим файл C:\OpenVPN\easy-rsa\vars.bat, скопировав в него нижеследующий текст:

    @echo off
    set path=%path%;c:\OpenVPN\bin
    set HOME=c:\OpenVPN\easy-rsa
    set KEY_CONFIG=openssl.cnf
    set KEY_DIR=c:\OpenVPN\ssl
    set KEY_SIZE=1024
    set KEY_COUNTRY=RU
    set KEY_PROVINCE=Kaluga
    set KEY_CITY=Kaluga
    set KEY_ORG=CompKaluga
    set KEY_EMAIL=decker@compkaluga.ru 

    А также файл C:\OpenVPN\easy-rsa\openssl.cnf:

    #
    # OpenSSL example configuration file.
    # This is mostly being used for generation of certificate requests.
    #
    
    # This definition stops the following lines choking if HOME isn't
    # defined.
    HOME			= .
    RANDFILE		= $ENV::HOME/.rnd
    
    # Extra OBJECT IDENTIFIER info:
    #oid_file		= $ENV::HOME/.oid
    oid_section		= new_oids
    
    # To use this configuration file with the "-extfile" option of the
    # "openssl x509" utility, name here the section containing the
    # X.509v3 extensions to use:
    # extensions		= 
    # (Alternatively, use a configuration file that has only
    # X.509v3 extensions in its main [= default] section.)
    
    [ new_oids ]
    
    # We can add new OIDs in here for use by 'ca' and 'req'.
    # Add a simple OID like this:
    # testoid1=1.2.3.4
    # Or use config file substitution like this:
    # testoid2=${testoid1}.5.6
    
    ####################################################################
    [ ca ]
    default_ca	= CA_default		# The default ca section
    
    ####################################################################
    [ CA_default ]
    
    dir		= $ENV::KEY_DIR		# Where everything is kept
    certs		= $dir			# Where the issued certs are kept
    crl_dir		= $dir			# Where the issued crl are kept
    database	= $dir/index.txt	# database index file.
    new_certs_dir	= $dir			# default place for new certs.
    
    certificate	= $dir/ca.crt	 	# The CA certificate
    serial		= $dir/serial 		# The current serial number
    crl		= $dir/crl.pem 		# The current CRL
    private_key	= $dir/ca.key	 	# The private key
    RANDFILE	= $dir/.rand		# private random number file
    
    x509_extensions	= usr_cert		# The extentions to add to the cert
    
    # 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.
    # crl_extensions	= crl_ext
    
    default_days	= 3650			# how long to certify for
    default_crl_days= 30			# how long before next CRL
    default_md	= md5			# 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_match
    
    # For the CA policy
    [ policy_match ]
    countryName		= match
    stateOrProvinceName	= match
    organizationName	= match
    organizationalUnitName	= optional
    commonName		= supplied
    emailAddress		= optional
    
    # For the 'anything' policy
    # At this point in time, you must list all acceptable 'object'
    # types.
    [ policy_anything ]
    countryName		= optional
    stateOrProvinceName	= optional
    localityName		= optional
    organizationName	= optional
    organizationalUnitName	= optional
    commonName		= supplied
    emailAddress		= optional
    
    ####################################################################
    [ req ]
    default_bits		= $ENV::KEY_SIZE
    default_keyfile 	= privkey.pem
    distinguished_name	= req_distinguished_name
    attributes		= req_attributes
    x509_extensions	= v3_ca	# The extentions to add to the self signed cert
    
    # Passwords for private keys if not present they will be prompted for
    # input_password = secret
    # output_password = secret
    
    # This sets a mask for permitted string types. There are several options. 
    # default: PrintableString, T61String, BMPString.
    # pkix	 : PrintableString, BMPString.
    # utf8only: only UTF8Strings.
    # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
    # MASK:XXXX a literal mask value.
    # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
    # so use this option with caution!
    string_mask = nombstr
    
    # req_extensions = v3_req # The extensions to add to a certificate request
    
    [ req_distinguished_name ]
    countryName			= Country Name (2 letter code)
    countryName_default		= $ENV::KEY_COUNTRY
    countryName_min			= 2
    countryName_max			= 2
    
    stateOrProvinceName		= State or Province Name (full name)
    stateOrProvinceName_default	= $ENV::KEY_PROVINCE
    
    localityName			= Locality Name (eg, city)
    localityName_default		= $ENV::KEY_CITY
    
    0.organizationName		= Organization Name (eg, company)
    0.organizationName_default	= $ENV::KEY_ORG
    
    # we can do this but it is not needed normally :-)
    #1.organizationName		= Second Organization Name (eg, company)
    #1.organizationName_default	= World Wide Web Pty Ltd
    
    organizationalUnitName		= Organizational Unit Name (eg, section)
    #organizationalUnitName_default	=
    
    commonName			= Common Name (eg, your name or your server\'s hostname)
    commonName_max			= 64
    
    emailAddress			= Email Address
    emailAddress_default		= $ENV::KEY_EMAIL
    emailAddress_max		= 40
    
    # SET-ex3			= SET extension number 3
    
    [ req_attributes ]
    challengePassword		= A challenge password
    challengePassword_min		= 4
    challengePassword_max		= 20
    
    unstructuredName		= An optional company name
    
    [ usr_cert ]
    
    # These extensions are added when 'ca' signs a request.
    
    # This goes against PKIX guidelines but some CAs do it and some software
    # requires this to avoid interpreting an end user certificate as a CA.
    
    basicConstraints=CA:FALSE
    
    # Here are some examples of the usage of nsCertType. If it is omitted
    # the certificate can be used for anything *except* object signing.
    
    # This is OK for an SSL server.
    # nsCertType			= server
    
    # For an object signing certificate this would be used.
    # nsCertType = objsign
    
    # For normal client use this is typical
    # nsCertType = client, email
    
    # and for everything including object signing:
    # nsCertType = client, email, objsign
    
    # This is typical in keyUsage for a client certificate.
    # keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    
    # This will be displayed in Netscape's comment listbox.
    nsComment			= "OpenSSL Generated Certificate"
    
    # PKIX recommendations harmless if included in all certificates.
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer:always
    
    # This stuff is for subjectAltName and issuerAltname.
    # Import the email address.
    # subjectAltName=email:copy
    
    # Copy subject details
    # issuerAltName=issuer:copy
    
    #nsCaRevocationUrl		= http://www.domain.dom/ca-crl.pem
    #nsBaseUrl
    #nsRevocationUrl
    #nsRenewalUrl
    #nsCaPolicyUrl
    #nsSslServerName
    
    [ server ]
    
    # JY ADDED -- Make a cert with nsCertType set to "server"
    basicConstraints=CA:FALSE
    nsCertType			= server
    nsComment			= "OpenSSL Generated Server Certificate"
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer:always
    
    [ v3_req ]
    
    # Extensions to add to a certificate request
    
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    
    [ v3_ca ]
    
    
    # Extensions for a typical CA
    
    
    # PKIX recommendation.
    
    subjectKeyIdentifier=hash
    
    authorityKeyIdentifier=keyid:always,issuer:always
    
    # This is what PKIX recommends but some broken software chokes on critical
    # extensions.
    #basicConstraints = critical,CA:true
    # So we do this instead.
    basicConstraints = CA:true
    
    # Key usage: this is typical for a CA certificate. However since it will
    # prevent it being used as an test self-signed certificate it is best
    # left out by default.
    # keyUsage = cRLSign, keyCertSign
    
    # Some might want this also
    # nsCertType = sslCA, emailCA
    
    # Include email address in subject alt name: another PKIX recommendation
    # subjectAltName=email:copy
    # Copy issuer details
    # issuerAltName=issuer:copy
    
    # DER hex encoding of an extension: beware experts only!
    # obj=DER:02:03
    # Where 'obj' is a standard or added object
    # You can even override a supported extension:
    # basicConstraints= critical, DER:30:03:01:01:FF
    
    [ crl_ext ]
    
    # CRL extensions.
    # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
    
    # issuerAltName=issuer:copy
    authorityKeyIdentifier=keyid:always,issuer:always 

    Поздравляю! Вы только что создали основные конфигурационные файлы вашего сервера. Продолжим его настройку.

  4. Для дальнейшей настройки сервера нам будут необходимы некоторые навыки работы в командной строке. Прежде всего давайте разберемся, как ее запустить? Существует несколько способов, например, нажать Пуск → Выполнить (или комбинацию кнопок Win+R) на клавиатуре и в появившемся поле ввести cmd и нажать кнопку Ок. Однако, пользователям Windows 7 / Windows Vista понадобится запустить консоль с правами администратора, для этого проще всего на рабочем столе создать соответствующий ярлык. Щелкаем правой кнопкой мыши по любому пустому месту рабочего стола и выбираем пункт «Создать ярлык», в поле «месторасположение объекта» просто указываем три буквы - cmd и называем ярлык cmd, либо командная строка. Далее, пользователи Windows XP просто запускают его, а пользователи Windows Vista и Windows 7 запускают его от имени администратора, так, как это делалось выше с блокнотом.
  5. Далее последовательно вводим в консоли строки:
    cd C:\OpenVPN\easy-rsa
    vars
    clean-all 

    При этом на экране это должно выглядеть так: Далее не закрывая это окно вводим последовательно команды генерации ключей:

    openvpn --genkey --secret %KEY_DIR%\ta.key
    build-dh
    build-ca

    Последняя команда (build-ca) создаст сертификат и ключ центра сертификации (CA), в процессе, правда, она задаст вам несколько вопросов, ответить на которые надо по-умолчанию нажатием кнопки Enter: Теперь создадим ключ сервера:

    build-key-server server

    Обратите внимание, вторым аргументом в команде идет имя ключа (server), это же имя вы должны ввести при ответе на вопрос Common Name (eg, your name or your server's hostname), на остальные вопросы можно ответить по-умолчанию нажатием кнопки Enter. Если вы все сделали правильно команда предложит подписать сертификат и подтвердить запрос, на оба вопроса нужно ответить Y (см. скриншот): Если вы все сделали правильно, то картинка у вас будет идентичной скриншоту, а в последних строчках вывода команды будет сообщение об успешном добавлении одной записи в базу данных.

  6. После этого идем в оснастку «Службы и приложения» консоли управления, сделать это можно щелкнув по ярлыку Компьютер (Мой компьютер) правой кнопкой мыши и выбрав пункт меню Управление, либо набрав в консоли команду services.msc, находим там службу «OpenVPN Service» и в меню по правой кнопки мыши выбираем «Пуск». Если до этого вы все сделали правильно, то служба перейдет в состояние «Работает». Теперь можно изменить ей тип запуска на «Авто», вместо «Вручную», который был там по-умолчанию. В результате должно получиться так: На этом настройка самого сервера закончена, осталось только сконфигурировать клиентов. Для этого необходимо также выдать им ключи и сертификаты, делается это практически аналогично серверу, только для сервера мы использовали команду build-key-server, а для клиентов будем использовать команду build-key.
  7. Предположим что у нас два клиента, назовем их client1 и client2. Выполним последовательно команды:
    build-key client1
    build-key client2  

    При этом на вопрос Common Name (eg, your name or your server's hostname) вы также должны указать имя клиента используемое в команде, т.е. если вы вводили команду build-key client1, то на вопрос Common Name отвечаем client1, если client2, то client2. На остальные вопросы можно ответить нажатием Enter, в конце вас также попросят подписать сертификат и подтвердить запрос, на оба пункта отвечаем утвердительно - Y. Теперь перезапускаем службу OpenVPN для того чтобы изменения вступили в силу, в оснастке управления службами, в меню по правой кнопке мыши «Перезапуск», либо же в консоли последовательно вводим:

    net stop openvpnservice
    net start openvpnservice 
  8. Теперь если мы зайдем в папку, то увидим там сгенерированные нами файлы ключей и сертификатов: Каждому клиенту необходимы будут его файлы:
    ca.crt
    <clientname>.crt
    <clientname>.key
    ta.key

    Т.е. для клиента 1 мы собираем файлы ca.crt, client1.crt, client1.key и ta.key, для клиента 2 - ca.crt, client2.crt, client2.key и ta.key соответственно и т.п. И тем или иным образом отправляем ему их (имеется ввиду по почте, в архиве с паролем, или на флешке), файлы ключей и сертификатов должны быть переданы по надежным каналам связи и не должны попасть в «третьи руки», т.к. фактически с помощью них клиент может получить доступ в вашу виртуальную подсеть. В следующем разделе мы рассмотрим настройку клиента, при этом будет предполагаться что файлы ключей и сертификатов от вас он уже получил.

  9. Если на ПК используемом в качестве сервера используется firewall / брандмауэр, то необходимо добавить OpenVPN в список исключений. Для встроенного брандмауэра Windows в консоли это можно сделать следующей командой:
    netsh firewall add allowedprogram program = C:\OpenVPN\bin\openvpn.exe name = "OpenVPN Server" ENABLE scope = ALL profile = ALL

Настройка клиента

Настройка клиента значительно проще, чем настройка сервера, у клиента нам не нужно генерировать ключи, сертификаты и т.п., так как все необходимое уже было сгенерировано нами на сервере и передано клиенту. Поэтому инструкция в случае для клиента получается значительно короче.

  1. Ориентируясь на инструкцию по настройке сервера скачиваем дистрибутив OpenVPN с официального сайта, устанавливаем его и создаем в папке C:\OpenVPN подпапку SSL.
  2. Помещаем в нее файлы ca.crt, client1.crt, client1.key и ta.key, переданные нам владельцем сервера.
  3. Запускаем блокнот и создаем файл Client1.ovpn следующего содержания:
    # decker OpenVPN Config File (c) Decker, decker@compkaluga.ru 
    dev tap 
    # dev-node "OpenVPN"  
    proto tcp  
    remote x.x.x.x 7777  
    route-delay 3  
    client  
    tls-client  
    ns-cert-type server  
    ca C:\\OpenVPN\\ssl\\ca.crt  
    cert C:\\OpenVPN\\ssl\\client1.crt  
    key C:\\OpenVPN\\ssl\\client1.key  
    tls-auth C:\\OpenVPN\\ssl\\ta.key 1  
    comp-lzo  
    tun-mtu 1500  
    tun-mtu-extra 32  
    mssfix 1450  
    ping-restart 60  
    ping 10  
    status C:\\OpenVPN\\log\\openvpn-status.log  
    log C:\\OpenVPN\\log\\openvpn.log  
    verb 3

    Обратите внимание, здесь client1.crt и client1.key - это названия файлов полученные вами от владельца сервера. x.x.x.x - это IP адрес или доменное имя OpenVPN сервера, 7777 - номер порта сервера.

  4. Заходим в оснастку «Службы и приложения», так, как это описано в разделе настроек сервера и запускаем службу OpenVPN, если она успешно запустилась, то выставляем ей тип запуска в «Авто».
  5. Одновременно обращаем внимание на свойства нашего OpenVPN адаптера, если вы все настроили правильно, то через несколько секунд после запуска службы OpenVPN адаптер получит сетевой адрес от сервера:

Полезные ссылки

Примечание (от автора)

В последнее время к нам на электронную почту приходит большое количество вопросов в стиле «Вопрос по Вашей статье http://compkaluga.ru/articles/172/ на шаге 5 после команды clean-all в результате у Вас копируется какой-то файл. У меня этого не происходит. команда openvpn –genkey –secret %KEY_DIR%\ta.key создает мне ключ а вот далее build-dh иbuild-ca не дают результата (cmd.exe пишет, что команда не является внутренней или внешней… или исполняемым файлом) файл ca.key не создается. Что я мог сделать не так?».

Основной смысл которых сводится к вашей же невнимательности. Проблема при запуске clean-all, build-key и других команд заключается в том, что при установке OpenVPN вы не поставили галочки OpenSSL Utilities и OpenVPN RSA Certificate Management Scripts (их нужно ставить обязательно!). Обратите внимание на скриншот с окном выбора компонентов в начале статьи, там эти галочки стоят!


Настройка OpenVPN сервера © Скорая Компьютерная Помощь г. Калуга Автор:Decker


На главную, Заметки

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
R Q I J E
 
notes/openvpn/openvpn_erver_setup.txt · Последнее изменение: 2017/01/30 19:39 — 127.0.0.1

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: GNU Free Documentation License 1.3
GNU Free Documentation License 1.3 Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki