Сети‎ > ‎

VPN

https://openvpn.net/index.php/open-source/documentation/howto.html#examples
https://openvpn.net/index.php/open-source/documentation/manuals/65-openvpn-20x-manpage.html


Столько много писал, а оно все удалило... :-(
Приходится опять начать.
Это черновик
Ссылки

 Что такое OPENVPN

Созданный в 2002 году, OpenVPN - это инструмент с открытым исходным кодом, используемый для построения site-to-site VPN сетей с использованием SSL/TLS протокола или с разделяемыми ключами. Он выполняет роль безопасного туннеля для передачи данных через один TCP/UDP порт в небезопасной сети как Интернет.

openmaniak openvpn tunnel picture

 Преимущество OpenVPN заключается в легкости инсталляции и настройки, что является редким случаем для таких инструментов. 
OpenVPN может быть установлен практически на любую платформу включая: Linux, Windows 2000/XP/Vista, OpenBSD, FreeBSD, NetBSD, Mac OS X и Solaris. Linux системы должны работать на ядре 2.4 или выше. Принципы конфигурирования одинаковы для всех платформ.

OpenVPN использует клиент/сервер архитектуру. Он должен быть установлен на все узлы VPN сети, где один узел должен быть сервером, а остальные клиентами.
OpenVPN создает TCP или UDP туннель, при этом данные проходящие через этот туннель шифруются. Стандартный порт для OpenVPN - UDP 1194, но можно использовать любой другой TCP или UDP порт. С версии 2.0 один и тот же порт можно использовать для нескольких туннелей на OpenVPN сервере. Начиная с версии 2.0, вы можете использовать любой другой TCP или UDP порт. На OpenVPN сервере один и тот же порт может быть использован для нескольких туннелей.

OpenVPN обеспечивает возможность шифрования канала. При использовании статических ключей, VPN шлюзы используют один и тот же ключ для шифрования и дешифрования данных. В этом случае настройка будет довольно простой, но при этом возникает проблема передачи и безопастноси ключа. Если кто-то завладеет этим ключом, то он может дешифровать данные. Для того чтобы избежать этой проблемы необходимо использовать Инфраструктуру Открытых Ключей (PKI). При этом каждый узел владеет двумя ключами: открытый ключ, известный всем и закрытый ключ доступный только его владельцу. Такую структуру использует OpenSSL, интегрированный в OpenVPN, для аутентификации VPN узлов перед тем как начать передавать зашифрованные данные.

 Вы можете создать Ethernet (Мост) или IP (Маршрутизация) VPN сеть используя соответствующие сетевые драйвера TAP или TUN. TAP/TUN доступны на всех платформах и включены в ядро Linux начиная с версии 2.4.

Как использовать OPENVPN.
OpenVPN можно постваить на ПК.
1) UBUNTU / DEBIAN
Просмотр версии:
#apt-cache policy openvpn
openvpn:
   Installed: (none)
   Candidate: 2.0.9-8
   Version table:
      2.0.9-8 0
         500 http://ch.archive.ubuntu.com gutsy/universe Packages 
 

Установка OpenVPN:
#apt-get install openvpn

Просмотр зависимостей OpenVPN:
#apt-cache depends openvpn
openvpn
  |Depends: debconf
   Depends:
    cdebconf
    debconf
   Depends: libc6
   Depends: liblzo2-2
   Depends: libssl0.9.8
   Suggests: openssl
   Suggests: resolvconf
2) WINDOWS
Конечно же лучше устанавливать OpenVPN на операционные системы с открытым исходным кодом, как Linux, но в некоторых случаях возможно вам понадобится устанавливать OpenVPN на Microsoft Windows...
Установка очень проста: загрузите .exe файл, запустите его и нажимайте на кнопки "Next" с настройками по умолчанию.
Установка OpenVPN на Windows не требует ничего дополнительно.   

3) Маршрутизаторы.
Некоторые маршрутизаторы поддерживают OpenVPN. Некоторые маршрутизаторы, которые не поддерживают OpenVPN, могут быть перепрошиты прошивками, например DD-WRT (www.dd-wrt.com). Поддерживаемые маршрутизаторы прошивками DD-WRT  тут.  Статьи об этом тут 

Настройка.
Для ПК конфигурационные параметры прописываются в файле.  
- настраивается режим VPN
- настраиваются адреса
- настраивается шифрование

Все параметры: тут

Режимы VPN.
 --dev tunX | tapX | null
TUN/TAP virtual network device ( X can be omitted for a dynamic device.)  See examples section below for an example on setting up a TUN device. You must use either tun devices on both ends of the connection or tap devices on both ends. You cannot mix them, as they represent different underlying network layers. tun devices encapsulate IPv4 or IPv6 (OSI Layer 3) while tap devices encapsulate Ethernet 802.3 (OSI Layer 2).
tun - режим маршрутизации
tap - режим моста

--mode m
Set OpenVPN major mode. By default, OpenVPN runs in point-to-point mode ("p2p"). OpenVPN 2.0 introduces a new mode ("server") which implements a multi-client server capability.
--local host
Local host name or IP address for bind. If specified, OpenVPN will bind to this address only. If unspecified, OpenVPN will bind to all interfaces.
--remote host [port] [proto]
Remote host name or IP address. On the client, multiple --remote options may be specified for redundancy, each referring to a different OpenVPN server. Specifying multiple --remote options for this purpose is a special case of the more general connection-profile feature. See the <connection> documentation below.
The OpenVPN client will try to connect to a server at host:port in the order specified by the list of --remote options.
proto indicates the protocol to use when connecting with the remote, and may be "tcp" or "udp".
The client will move on to the next host in the list, in the event of connection failure. Note that at any given time, the OpenVPN client will at most be connected to one server.
Note that since UDP is connectionless, connection failure is defined by the --ping and --ping-restart options.
Note the following corner case: If you use multiple --remote options, AND you are dropping root privileges on the client with --user and/or --group, AND the client is running a non-Windows OS, if the client needs to switch to a different server, and that server pushes back different TUN/TAP or route settings, the client may lack the necessary privileges to close and reopen the TUN/TAP interface. This could cause the client to exit with a fatal error.
If --remote is unspecified, OpenVPN will listen for packets from any IP address, but will not act on those packets unless they pass all authentication tests. This requirement for authentication is binding on all potential peers, even those from known and supposedly trusted IP addresses (it is very easy to forge a source IP address on a UDP packet).
When used in TCP mode, --remote will act as a filter, rejecting connections from any host which does not match host.
If host is a DNS name which resolves to multiple IP addresses, one will be randomly chosen, providing a sort of basic load-balancing and failover capability.
--proto p
Use protocol p for communicating with remote host. p can be udp, tcp-client, or tcp-server.
The default protocol is udp when --proto is not specified.
For UDP operation, --proto udp should be specified on both peers.
For TCP operation, one peer must use --proto tcp-server and the other must use --proto tcp-client. A peer started with tcp-server will wait indefinitely for an incoming connection. A peer started with tcp-client will attempt to connect, and if that fails, will sleep for 5 seconds (adjustable via the --connect-retry option) and try again infinite or up to N retries (adjustable via the --connect-retry-max option). Both TCP client and server will simulate a SIGUSR1 restart signal if either side resets the connection.
OpenVPN is designed to operate optimally over UDP, but TCP capability is provided for situations where UDP cannot be used. In comparison with UDP, TCP will usually be somewhat less efficient and less robust when used over unreliable or congested networks.
This article outlines some of problems with tunneling IP over TCP:
http://sites.inka.de/sites/bigred/devel/tcp-tcp.html
There are certain cases, however, where using TCP may be advantageous from a security and robustness perspective, such as tunneling non-IP or application-level UDP protocols, or tunneling protocols which don't possess a built-in reliability layer.

Режимы шифрования.

1) OpenVPN - Режим прозрачного туннеля
Хотя это не очень полезно, но OpenVPN позволяет создавать туннели без шифрования данных. Это означает, что данные передаваемые через этот туннель можно прочитать.
Прозрачный туннель:

openmaniak openvpn transparent tunnel
Если вы хотите шифровать данные внутри туннеля, тогда необходимо использовать разделяемый ключ или режим SSL.
Шифрованный туннель:
openmaniak openvpn encrypted tunnel 
Режим прозрачного туннеля должен использоваться только для тестирования.

2) OpenVPN - Разделяемые (статические) ключи

Вы легко можете создать разделяемый ключ для OpenVPN на любой платформе.
Создав ключ, вы должны скопировать его на другой OpenVPN узел. Копировать его следует только через безопасный канал как SSH либо через физический носитель, например гибкий диск.
Для создания ключа выполните следующее:
На Linux:

##openvpn --genkey --secret /home/user/key.txt
На Windows:
openmaniak generate a static openvpn key
Давайте посмотрим файл, который мы только что создали:
openmaniak openvpn static key

OpenVPN ключ состоит из шестнадцатеричных символов и делиться на четыре части.
Первая часть используется как ключ для шифрования данных, а вторая как ключ для хэш функции. По умолчанию ключ для шифрования и расшифрования данных один и тот же, это относится также и к хэш функции.
Третья и четвертая часть OpenVPN ключа используется в том случае, когда вы хотите использовать разные ключи для для шифрования/расшифрования данных и для хэш функции.     

Do not confuse the OpenVPN key which is composed of 512 hexadecimal characters with the keys used by the cipher and hash function algorithm to secure the OpenVPN tunnel which are composed by hexadecimal characters inside the OpenVPN key.
По умолчанию алгоритм шифрования Blowfish используется с 128-бит ключами, а хэш функция с 160-бит ключами.
Каждый шестнадцатеричный символ представляет 4 бита, таким образом 128 и 160 бит будут представляется соответственно 32 (128/4) и 40 (160/4) шестнадцатеричными символами.    
В нашем примере шестнадцатеричные символы используемые для ключей обведены красной линией.
Символы не используемые для ключей могут не совпадать в разных файлах.  
Если вы хотите закончить конфигурацию OpenVPN, перейдите на руководство по OpenVPN.      
Примеры использования OpenVPN с разделяемыми ключами можно найти в разделе примеры.    

Реализация режима разделяемых ключей проще чем SSL/TLS режим, но при этом он имеет такие недостатки:
- Разделяемый ключ не обновляется.
- Разделяемый ключ необходимо скопировать на все узлы.
- VPN узлы не аутентифицируются. 
 
3) На основе Инфраструктурі Открытых Ключей (Public Key Infrastructure, PKI):
SSL - протокол для передачи шифрованых данных.
PKI (Инфраструктура открытых ключей) - набор средств (технических, материальных, людских и т. д.), распределенных служб и компонентов, в совокупности используемых для поддержки криптозадач на основе закрытого и открытого ключей.
Идея PKI (также известно как асимметричное шифрование) основана на том, что каждый узел имеет два ключа:
- открытый ключ (известен всем участникам)
- секретный ключ (известен только владельцу ключа).

В основе PKI лежит использование криптографической системы с открытым ключом и несколько основных принципов:

  1. закрытый ключ известен только его владельцу;
  2. Центр сертификации (CA) создает сертификат открытого ключа, таким образом удостоверяя этот ключ;
  3. никто не доверяет друг другу, но все доверяют Центру сертификации ;
  4. центр сертифкации подтверждает или опровергает принадлежность открытого ключа заданному лицу, которое владеет соответствующим закрытым ключом.

Секретные ключи и сертификаты: Секретный ключ должен держаться в секрете, а открытый ключ должен распространяться через Сертификаты. Цель сертификата заверить, что открытый ключ принадлежит тому кто утверждает, что это его ключ (т.е. владеет соответствующим секретным ключом). Без сертификата вы не можете быть уверены, что открытый ключ соответствует тому кто владеет соответствующим секретным ключом.
Центр сертификации (Certification Authority, CA): Для заверения подлинности сертификат подписывается организацией, которой все доверяют. Некоторые организации такие как VeriSign и Comodo делают свой бизнес продавая такие сертификаты.
Возможно также создание своего CA во внутренней сети в целях тестирования. Это как раз то, что мы будем делать в нашем руководстве.                     
CA сертификат: CA подписывает сертификаты своим секретным ключом и публикует свой открытый ключ в виде сертификата. CA сертификат подписывается собственным секретным ключом. Например вы можете проверить CA сертификаты, также называемые корневыми сертификатами, в вашем веб браузере. (нажмите на ссылку для того, чтобы увидеть снимки экрана)

Opera 9:
 FireFox 2:
IE 7:
Tools -> Preferences -> Advanced tab -> Security -> Manage certificates Authorities tab.
Tools -> Options -> Advanced -> View Certificates -> Authorities tab.
Tools -> Internet Options -> Content tab -> Encryption tab -> Certificates -> Trusted Root Certification Authorities.
Секретный ключ и создание сертификата:
В первую очередь клиент должен создать секретный ключ и файл для запроса сертификата используя RSA алгоритм. Этот файл необходимо отравить в Центр сертификации, который создаст сертификат и отправит его обратно клиенту.
В нашем случае, так как мы находимся в лаборатории, мы воспользуется более простым вариантом.
Секретный ключ клиента создается на компьютере который является Центром сертификации вместе с сертификатом. Клиенту не нужно посылать запрос на сертификат в CA.
Секретный ключ и сертификат копируются с CA компьютера на клиентский. Конечно же такой способ создания сертификатов должен использоваться только в целях тестирования.
Так как секретный ключ может быть перехвачен во время копирования.
В первом варианте описанном выше секретный ключ никогда не покидает компьютер клиента.
Использование асимметричных ключей:
На примере Элис и Боба покажем использование асимметричный ключей.

Создание PKI:
  OpenVPN предлагает набор скриптов основанных на OpenSSL для облегчения создания сертификатов и генерации ключей. Мы рассмотрим создание PKI на Linux и Windows платформах.
Для того чтобы узнать больше о OpenSSL смотрите сайт OpenSSL.

На Windows вам возможно понадобиться создать два файла:
C:\Program Files\OpenVPN\easy-rsa>init-config.bat
C:\Program Files\OpenVPN\easy-rsa>copy vars.bat.sample vars.bat
The system cannot find the file specified.
 C:\Program Files\OpenVPN\easy-rsa>copy openssl.cnf.sample openssl.cnf
1 file(s) copied.
  Установим переменные:
Отредактируем "C:\Program Files\OpenVPN\easy-rsa\vars.bat" (Microsoft Windows) или "/home/user/openvpn/vars" (Linux) файл и установим переменные.
set KEY_COUNTRY=US
set KEY_PROVINCE=CA
set KEY_CITY=San Francisco
set KEY_ORG=OpenManiak
set KEY_EMAIL=webmaster@openvpntest.com


Инициализируем переменные:
C:\Program Files\OpenVPN\easy-rsa>vars
/home/user/openvpn/#. ./vars
Удалим старые ключи:
#clean-all.bat
/home/user/openvpn/#./clean-all
1 file(s) copied.
1 file(s) copied.
  Создание центра сертификации:
Создадим секретный ключ центра сертификации и сертификат. Сертификат включает в себя открытый ключ.
C:\Program Files\OpenVPN\easy-rsa>build-ca.bat
/home/user/openvpn/#./build-ca

Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
...++++++
.........++++++
writing new private key to 'keys\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) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [OpenManiak]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
master-openmaniak
Email Address [TeddyBear@openvpntest.com]:

Будут созданы два файла:
секретный ключ центра сертификации и CA сертификат.
CA сертификат подписывается собственным секретным ключом и включает открытый ключ.

Создадим секретный ключ и сертификат для OpenVPN сервера.

C:\Program Files\OpenVPN\easy-rsa>build-key-server.bat server
/home/user/openvpn/#./build-key-server server

Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
........................................................++++++
.........................++++++
writing new private key to 'keys\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) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [OpenManiak]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
server
Email Address [TeddyBear@openvpntest.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from openssl.cnf
Loading 'screen' into random state - done
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'US'
stateOrProvinceName :PRINTABLE:'CA'
localityName :PRINTABLE:'SanFrancisco'
organizationName :PRINTABLE:'OpenManiak'
commonName :PRINTABLE:'server'
emailAddress :IA5STRING:'TeddyBear@openvpntest.com'
Certificate is to be certified until Sep 6 17:36:18 2017 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
Этот скрипт выполнить две openssl команды, первая создаст секретный ключ и файл запроса сертификата, а вторая создаст сертификат.

Создадим секретный ключ и сертификат для OpenVPN клиента.

C:\Program Files\OpenVPN\easy-rsa>build-key.bat client
/home/user/openvpn/#./build-key client

Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
........................................................++++++
.........................++++++
writing new private key to 'keys\client.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) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [OpenManiak]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
client
Email Address [TeddyBear@openvpntest.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from openssl.cnf
Loading 'screen' into random state - done
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'US'
stateOrProvinceName :PRINTABLE:'CA'
localityName :PRINTABLE:'SanFrancisco'
organizationName :PRINTABLE:'OpenManiak'
commonName :PRINTABLE:'server'
emailAddress :IA5STRING:'TeddyBear@openvpntest.com'
Certificate is to be certified until Sep 6 17:36:18 2017 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
Теперь мы имеем сертификаты и секретные ключи для OpenVPN сервера и клиента. Их необходимо скопировать на соответствующие OpenVPN узлы.

Очень важное замечание:

Как уже обсуждалось выше, мы использовали Центр Сертификации для создания секретных ключей и сертификатов. Эта процедура должна использоваться только в лабораторных условиях в виду того, что CA должен копировать секретный ключ клиенту.

Алгоритм Диффи-Хеллмана

Алгоритм Диффи-Хеллмана (Diffie- Hellman, DH) позволяет двум узлам получить общий секретный ключ используя незащищенный канал связи.

Давайте создадим настройки для алгоритма Диффи-Хеллмана.

C:\Program Files\OpenVPN\easy-rsa>build-dh.bat
/home/user/openvpn/#./build-dh

Loading 'screen' into random state - done
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.................................................................
....+.................................................+..........
.....................+.....+......................+..............
.............................................+...................
.....+...........................................................
..............................................................+..
.................+............+............................+.....
.......+.....................................................+...
...+......+..+...........................+.........+...+.........
..............................++*++*++*

Настройка алгоритма DH нужна только для OpenVPN сервера, OpenVPN клиенты не нуждаются в настройке DH.