Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Security —> Установка и настройка OpenVPN

Установка и настройка OpenVPN с ключом pkcs12

Автор: Cancer.



На днях появилась задача - объединить головной офис и 3 филиала в одну сеть через интернет посредством OpenVPN, чтобы люди могли подключаться через RDP к базам на серверах, а, в свою очередь, админы имели удаленный доступ к ПК филиалов по VNC, RDP итд итп.

В офисе 2 канала в интернет:
IP=86.86.ххx.x (основной канал) и IP=90.90.xx.x (резервный канал).
В офисе работает скрипт переключение каналов, если вдруг упадет основной канал скрипт переключится на резервный канал. Филиалы должны переподключиться на резервный канал при падении основного интернет-канала в офисе, а при восстановлении основного интернет-канала в офисе, переподключиться обратно на основной.


Почему OpenVPN?

1. OpenVPN - кроссплатформенное программное обеспечение, а для меня это очень важно, так как на гейтах филиалах находятся разные операционные системы.
OpenVPN используется на Solaris, OpenBSD, FreeBSD, NetBSD, GNU/Linux, Apple Mac OS X, QNX и Microsoft Windows.
2. Нужно видеть всю сеть за гейтом филиала и обратно, а именно объединить все подсети.
3. Компрессия с помощью библиотеки компрессии LZO, для сжатия потока данных.
4. Шифрование канала, для обеспечения безопасности управляющего канала и потока данных, OpenVPN использует библиотеку OpenSSL.

Исходные данные:

+---------------+----------------+--------------------+
|Подразделение  |    Подсеть     |  ОС гейта/клиента  |
+---------------+----------------+--------------------+
|Офис           | 192.168.0.0/24 | FreeBSD            |
|Филиал №1      | 192.168.1.0/24 | FreeBSD            |
|Филиал №2      | 192.168.2.0/24 | Windows XP         |
|Филиал №3      | 192.168.3.0/24 | CentOS             |
|Sysadmin       |                | Windows XP         |
+---------------+----------------+--------------------+



Схема сети:





Устанавливаем OpenVPN

//> cd /usr/ports/security/openvpn
/usr/ports/security/openvpn/> make config

     +--------------------------------------------------------------------+
     |                   Options for openvpn 2.1.4                        |
     | +----------------------------------------------------------------+ |
     | |  [ ] PW_SAVE  Interactive passwords may be read from a file    | |
     | |  [ ] PKCS11   Use security/pkcs11-helper                       | |
     | |                                                                | |
     | |                                                                | |
     | |                                                                | |
     | |                                                                | |
     | |                                                                | |
     +-+------v(+)------------------------------------------------------+-+
     |                       [  OK  ]       Cancel                        |
     +--------------------------------------------------------------------+

/usr/ports/security/openvpn/> make install clean

Далее переходим в каталог ../easy-rsa/2.0/
//> cd /usr/local/share/doc/openvpn/easy-rsa/2.0/

/usr/local/share/doc/openvpn/easy-rsa/2.0/> ee vars

В нем меняем 1 строку
# Меняем export KEY_DIR="$EASY_RSA/keys" на
export KEY_DIR="$EASY_RSA/keys/server"
# меняем export KEY_SIZE=1024 на 2048
# (тем самым увеличим размер ключей с 1024 бит до 2048 бит)
export KEY_SIZE=2048


Даем на скрипты права на исполняемость r-xr--r--
/usr/local/share/doc/openvpn/easy-rsa/2.0/> chmod 544 *


Создаем директорию куда у нас будут создаваться/храниться ключи и сертификаты.
/usr/local/share/doc/openvpn/easy-rsa/2.0/> mkdir -p keys/server


Далее запускаем shell
/usr/local/share/doc/openvpn/easy-rsa/2.0/> sh

#. ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on 
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server
#./clean-all


Создаем ключи для нашего сервера OpenVPN



Создаем 2 ключа (ca.key и dh2048.pem) и по 1 ключу/сертификату (server.key и server.crt) только для сервера OpenVPN и дополнительный ключ (ta.key) для сервера и клиента.
Создаем их один раз и навсегда.

1. Создаем 1-ый ключ Certificate Authority
# ./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) [US]:RU
State or Province Name (full name) [CA]:Rostov-on-Don
Locality Name (eg, city) [SanFrancisco]:Rostov-on-Don
Organization Name (eg, company) [Fort-Funston]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:server
Name []:server
Email Address [me@myhost.mydomain]:root@localhost
#



2. Создаем сертификат X.509
# ./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) [US]:RU
State or Province Name (full name) [CA]:Rostov-on-Don
Locality Name (eg, city) [SanFrancisco]:Rostov-on-Don
Organization Name (eg, company) [Fort-Funston]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) [server]:server
Name []:server
Email Address [me@myhost.mydomain]:root@localhost

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:server
Using configuration from /usr/local/share/doc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'Rostov-on-Don'
localityName          :PRINTABLE:'Rostov-on-Don'
organizationName      :PRINTABLE:'server'
organizationalUnitName:PRINTABLE:'server'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'server'
emailAddress          :IA5STRING:'root@localhost'
Certificate is to be certified until Sep  6 19:11:59 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
#




3. Генерируем 2048 битный ключ с помощью алгоритма Диффи Хеллмана
# ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...............................+.......+..............................++*++*++*
..............+.....*................++*..............................++.......
#


Выходим из shell
# exit

 
4. Создаем TLS-ключ (который нужен как и серверу, так и клиенту)
/../../../../openvpn/easy-rsa/2.0/> openvpn --genkey --secret keys/server/ta.key


Создаем директории для нашего OpenVPN сервера где будут храниться конфиг, ключи, сертификаты и настройки клиентов
//> mkdir /usr/local/etc/openvpn
//> mkdir /usr/local/etc/openvpn/keys
//> mkdir /usr/local/etc/openvpn/ccd



Переходим в директорию с ключами OpenVPN
//> cd /usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/


Копируем ключи из /usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/
в директорию /usr/local/etc/openvpn/keys
/../../easy-rsa/2.0/keys/server/> cp ca.crt /usr/local/etc/openvpn/keys/
/../../easy-rsa/2.0/keys/server/> cp server.crt /usr/local/etc/openvpn/keys/
/../../easy-rsa/2.0/keys/server/> cp server.key /usr/local/etc/openvpn/keys/
/../../easy-rsa/2.0/keys/server/> cp dh2048.pem /usr/local/etc/openvpn/keys/
/../../easy-rsa/2.0/keys/server/> cp ta.key /usr/local/etc/openvpn/keys/


получим следующий список файлов которые нужны для работы сервера
//> ls /usr/local/etc/openvpn/keys
ca.crt          dh2048.pem      server.crt      server.key      ta.key



Создаем конфигурационный файл нашего OpenVPN сервера.
//> ee /usr/local/etc/openvpn/server.conf

# указываем на каком локальном интерфейсе OpenVPN будет слушать
# по умолчанию OpenVPN слушает все интерфейсы
#local xxx.xxx.xx.x

# порт на котором работает сервер
port 1194

# протокол - TCP или UDP
proto udp

# используемый тип устройства и номер
dev tun0

# указываем по каким интерфейсам можно подключаться к OpenVPN по telnet
# указывать нужно IP адреса интерфейсов сервера
management localhost 8329
#management 192.168.0.xx 8329
#management 86.86.xxx.xx 8329

# указываем файл CA
ca /usr/local/etc/openvpn/keys/ca.crt

# указываем файл с сертификатом сервера
cert /usr/local/etc/openvpn/keys/server.crt

# указываем файл с ключем сервера
key /usr/local/etc/openvpn/keys/server.key

# указываем файл с генерированный алгоритмом Диффи Хеллмана
dh /usr/local/etc/openvpn/keys/dh2048.pem

# указываем где находится файл отозванных сертификатов
#crl-verify /usr/local/etc/openvpn/crl.pem

# задаем IP-адрес сервера и маску подсети (виртуальной сети)
server 10.10.100.0 255.255.255.0

# указываем внутренний DNS и WINS серверы
push "dhcp-option DNS 192.168.0.1"
push "dhcp-option DNS 192.168.0.10"
push "dhcp-option WINS 192.168.0.1"

# задаем МАРШРУТ который передаём клиенту
# и маску подсети для того чтобы он "видел"
# сеть за OpenVPN сервером
# Офис
push "route 192.168.0.0 255.255.255.0"
# Филиал №1
push "route 192.168.1.0 255.255.255.0"
# Филиал №2
push "route 192.168.2.0 255.255.255.0"
# Филиал №3
push "route 192.168.3.0 255.255.255.0"

# указываем где хранятся файлы с
# настройками IP-адресов клиентов
client-config-dir ccd

# добавляем маршрут сервер-клиент
route 10.10.100.0 255.255.255.252
# Филиал №1
route 192.168.1.0 255.255.255.0
# Филиал №2
route 192.168.2.0 255.255.255.0
# Филиал №3
route 192.168.3.0 255.255.255.0

# делает сервер OpenVPN основным шлюзом у клиентов
#push "redirect-gateway"

# разрешает видеть клиентам друг друга (по виртуальным IP)
# по умолчанию клиенты видят только сервер
client-to-client

# разрешать подключаться с одинаковым сертификатом/ключом
#duplicate-cn

# включаем TLS аутентификацию
tls-server

# для дополнительной безопасности при
# использовании SSL/TLS, создайте "HMAC firewall"
# для защиты от DoS аттак и флуда UDP порта.
#
# сгенерируйте с помощью:
#   openvpn --genkey --secret ta.key
#
# сервер и каждый клиент должны иметь копию этого ключа.
# второй параметр выставляется в '0' для сервера и '1' для клиентов.
tls-auth keys/ta.key 0

# TLS таймаут, полезен если выход в интернет осуществляется
# через GPRS мобильных операторов
tls-timeout 120

# выбираем алгоритм хеширования по умолчанию используется SHA1
# вывод полного списка командой openvpn --show-digests
auth SHA1

# выберите криптографический сертификат.
# этот пункт конфига должен копироваться
# в конфиг клиента, так же как он установлен здесь.
# по умолчанию используется/рекомендуется BF-CBC
# вывод полного списка командой openvpn --show-ciphers
#cipher BF-CBC        # Blowfish (default)
#cipher AES-128-CBC   # AES
#cipher DES-EDE3-CBC  # Triple-DES
cipher BF-CBC

# проверяет активность подключения каждые 10 секунд,
# если в течении 120 сек. нет ответа, подключение закрывается
keepalive 10 120

# сжатия трафика VPN туннеля с помощью библиотеки LZO
# если вы включили сжатие на сервере,
# вы так же должны включить и в конфиге у клиента
comp-lzo

# максимальное количество одновременно подключенных клиентов
max-clients 100

# от какого пользователя и группы будет работать OpenVPN
user nobody
group nobody

# имеет смысл использовать при использовании протокола udp
#mssfix 1450

# эти опции позволяют избежать необходимости
# получения доступа к определенным ресурсам
# после рестарта, т.к. это может быть невозможным
# из-за понижения привилегий.
persist-key
persist-tun

# путь к файлу записи статуса OpenVPN в лог
status /var/log/openvpn/openvpn-status.log

# путь к файлу записи событий происходящих на сервере
# "log" - запись событий в лог будет перезаписываться при перезагрузке демона
# "log-append" - запись событий будет добавляться в лог
log /var/log/openvpn/openvpn.log

# установите необходимый уровень логирования.
# 0 - ничего, за исключением фатальных ошибок
# 4 - подойдет для получения общих сведений
# 5 и 6 пригодяться для отладки проблем соединения
# 9 - максимально возможная информация
verb 3

# макс кол-во однотипных записей в лог
#mute 20


Создаем директорию /var/log/openvpn/ и 2 файла где будут храниться логи
//> mkdir /var/log/openvpn/
//> touch /var/log/openvpn/openvpn-status.log
//> touch /var/log/openvpn/openvpn.log



Добавляем OpenVPN в автозагрузку системы
//> ee /etc/rc.conf

openvpn_enable="YES"
openvpn_if="tun"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"
openvpn_dir="/usr/local/etc/openvpn"


И запускаем OpenVPN сервер
//> /usr/local/etc/rc.d/openvpn start
Starting openvpn.
//>


Проверим в процесcах
//> ps axw | grep openvpn

2983 ?? Ss 0:00.00 /usr/local/sbin/openvpn --cd /usr/local/etc/openvpn --daemon openvpn --config /usr/local/etc/openvpn/server.conf






Создаем ключи PKCS12 для Филиалов №1,2,3

 


Переходим в директорию и создаем ключи для филиалов №1,2,3:
filial1.p12, filial2.p12, filial3.p12
pkcs12 имя файла в формате PKCS#12, содержащего сертификат CA, ключ и сертификат клиента. Такой файл и команда заменяют сразу 3 соответствующих файла и команды - .ca, .cert, .key
//> cd /usr/local/share/doc/openvpn/easy-rsa/2.0/
/usr/local/share/doc/openvpn/easy-rsa/2.0/> sh


Эту команду нужно запускать при каждом создании новых ключей.
#. ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on 
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server
#


Создаем ключ для Филиала №1


# ./build-key-pkcs12 filial1
Generating a 2048 bit RSA private key
................................++++++
...........................................++++++
writing new private key to 'filial1.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]:RU
State or Province Name (full name) [CA]:Rostov-on-Don
Locality Name (eg, city) [SanFrancisco]:Rostov-on-Don
Organization Name (eg, company) [Fort-Funston]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) [filial1]:
Name []:filial1
Email Address [me@myhost.mydomain]:filial1@localhost

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:filial1
Using configuration from /usr/local/share/doc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'Rostov-on-Don'
localityName          :PRINTABLE:'Rostov-on-Don'
organizationName      :PRINTABLE:'server'
organizationalUnitName:PRINTABLE:'server'
commonName            :PRINTABLE:'filial1'
name                  :PRINTABLE:'filial1'
emailAddress          :IA5STRING:'filial1@localhost'
Certificate is to be certified until Sep  6 19:20:11 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
Enter Export Password:
Verifying - Enter Export Password:
#


Создаем ключ для Филиала №2

# ./build-key-pkcs12 filial2
Generating a 2048 bit RSA private key
................................++++++
...........................................++++++
writing new private key to 'filial2.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]:RU
State or Province Name (full name) [CA]:Rostov-on-Don
Locality Name (eg, city) [SanFrancisco]:Rostov-on-Don
Organization Name (eg, company) [Fort-Funston]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) [filial2]:
Name []:filial2
Email Address [me@myhost.mydomain]:filial2@localhost

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:filial2
Using configuration from /usr/local/share/doc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'Rostov-on-Don'
localityName          :PRINTABLE:'Rostov-on-Don'
organizationName      :PRINTABLE:'server'
organizationalUnitName:PRINTABLE:'server'
commonName            :PRINTABLE:'filial2'
name                  :PRINTABLE:'filial2'
emailAddress          :IA5STRING:'filial2@localhost'
Certificate is to be certified until Sep  6 19:21:14 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
Enter Export Password:
Verifying - Enter Export Password:
#


Создаем ключ для Филиала №3

# ./build-key-pkcs12 filial3
Generating a 2048 bit RSA private key
................................++++++
...........................................++++++
writing new private key to 'filial3.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]:RU
State or Province Name (full name) [CA]:Rostov-on-Don
Locality Name (eg, city) [SanFrancisco]:Rostov-on-Don
Organization Name (eg, company) [Fort-Funston]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) [filial3]:
Name []:filial3
Email Address [me@myhost.mydomain]:filial3@localhost

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:filial3
Using configuration from /usr/local/share/doc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'Rostov-on-Don'
localityName          :PRINTABLE:'Rostov-on-Don'
organizationName      :PRINTABLE:'server'
organizationalUnitName:PRINTABLE:'server'
commonName            :PRINTABLE:'filial3'
name                  :PRINTABLE:'filial3'
emailAddress          :IA5STRING:'filial3@localhost'
Certificate is to be certified until Sep  6 19:23:16 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
Enter Export Password:
Verifying - Enter Export Password:
#




Создаем ключ для Системного администратора

# ./build-key-pkcs12 sysadmin
Generating a 2048 bit RSA private key
................................++++++
...........................................++++++
writing new private key to 'sysadmin.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]:RU
State or Province Name (full name) [CA]:Rostov-on-Don
Locality Name (eg, city) [SanFrancisco]:Rostov-on-Don
Organization Name (eg, company) [Fort-Funston]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) [sysadmin]:
Name []:sysadmin
Email Address [me@myhost.mydomain]:sysadmin@localhost

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:sysadmin
Using configuration from /usr/local/share/doc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'Rostov-on-Don'
localityName          :PRINTABLE:'Rostov-on-Don'
organizationName      :PRINTABLE:'server'
organizationalUnitName:PRINTABLE:'server'
commonName            :PRINTABLE:'sysadmin'
name                  :PRINTABLE:'sysadmin'
emailAddress          :IA5STRING:'sysadmin@localhost'
Certificate is to be certified until Sep  6 19:27:27 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
Enter Export Password:
Verifying - Enter Export Password:
#

# exit


Вот мы и создали 3 ключа для филиалов и 1 для системного администратора
//> ls /usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server | grep .p12
filial1.p12
filial2.p12
filial3.p12
sysadmin.p12
//>



В директории /usr/local/etc/openvpn/ccd создаем файла с настройками для Филиалов и системного администратора

Филиал №1
//> ee /usr/local/etc/openvpn/ccd/filial1

С содержанием:
ifconfig-push виртуальный IP клиента,
iroute какая подсеть за клиентом
ifconfig-push 10.10.100.2 10.10.100.1
iroute 192.168.1.0 255.255.255.0

Филиал №2
//> ee /usr/local/etc/openvpn/ccd/filial2

С содержанием:
ifconfig-push виртуальный IP клиента,
iroute какая подсеть за клиентом
ifconfig-push 10.10.100.6 10.10.100.5
iroute 192.168.2.0 255.255.255.0

Филиал №3
//> ee /usr/local/etc/openvpn/ccd/filial3

С содержанием:
ifconfig-push виртуальный IP клиента,
iroute какая подсеть за клиентом
ifconfig-push 10.10.100.10 10.10.100.9
iroute 192.168.3.0 255.255.255.0


Системный администратор
//> ee /usr/local/etc/openvpn/ccd/sysadmin

С содержанием:
ifconfig-push виртуальный IP клиента
ifconfig-push 10.10.100.14 10.10.100.13




Перезапустим OpenVPN Сервер
//> /usr/local/etc/rc.d/openvpn restart
Stopping openvpn.
Starting openvpn.
//>


Проверим работу OpenVPN
//> sockstat | grep 1194
nobody   openvpn    29578 5  udp4   *:1194                *:*
//>

//> ifconfig tun0

tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 10.10.100.1 --> 10.10.100.2 netmask 0xffffffff
        Opened by PID 29517

Все нормально работает
Не забываем открыть порт 1194 если вы используете firewall
Для pf правило выглядит так
pass in quick on $ext_if inet proto {udp} from any to self port 1194






Установка и настройка OpenVPN Филиала №1 (FreeBSD)




Будем настраивать гейт у филиала №1 на FreeBSD
//> cd /usr/ports/security/openvpn/
/usr/ports/security/openvpn/> make config

     +--------------------------------------------------------------------+
     |                   Options for openvpn 2.1.4                        |
     | +----------------------------------------------------------------+ |
     | |  [ ] PW_SAVE  Interactive passwords may be read from a file    | |
     | |  [ ] PKCS11   Use security/pkcs11-helper                       | |
     | |                                                                | |
     | |                                                                | |
     | |                                                                | |
     | |                                                                | |
     | |                                                                | |
     +-+------v(+)------------------------------------------------------+-+
     |                       [  OK  ]       Cancel                        |
     +--------------------------------------------------------------------+

/usr/ports/security/openvpn/> make install clean



//> mkdir /usr/local/etc/openvpn
//> mkdir /usr/local/etc/openvpn/keys

Создаем конфиг клиента
//> ee /usr/local/etc/openvpn/filial1.conf

dev tun
proto udp
# IP сервера (основной канал)
remote 86.86.ххx.x
# IP сервера (резервный канал)
remote 90.90.xx.x
port 1194
client
resolv-retry infinite
pkcs12 keys/filial1.p12
tls-client
tls-auth keys/ta.key 1
auth SHA1
cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3


Создаем директорию /var/log/openvpn/ и 2 файла где будут храниться логи
//> mkdir /var/log/openvpn/
//> touch /var/log/openvpn/openvpn-status.log
//> touch /var/log/openvpn/openvpn.log



Теперь нам нужны ключи с самого сервера
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/filial1.p12
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/ta.key

копируем их на гейт Филиала №1 /usr/local/etc/openvpn/keys



Добавляем OpenVPN в автозагрузку системы
//> ee /etc/rc.conf

openvpn_enable="YES"
openvpn_if="tun"
openvpn_configfile="/usr/local/etc/openvpn/filial1.conf"
openvpn_dir="/usr/local/etc/openvpn"


И запускаем OpenVPN на филиале
//> /usr/local/etc/rc.d/openvpn start
Starting openvpn.
//>


Проверим в процессах
//> ps axw | grep openvpn

2983 ?? Ss 0:00.00 /usr/local/sbin/openvpn --cd /usr/local/etc/openvpn --daemon openvpn --config /usr/local/etc/openvpn/filial1.conf


Попробуем теперь пингануть DNS сервер Офиса
//> ping -c 4 192.168.0.1
PING 192.168.0.1 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: icmp_seq=1 ttl=127 time=30.6 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=127 time=65.5 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=127 time=31.5 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=127 time=31.7 ms

--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 30.651/39.875/65.579/14.845 ms


Ну и посмотрим трассировку.
//> traceroute 192.168.0.1
traceroute to 192.168.0.1 (192.168.0.1), 64 hops max, 40 byte packets
 1  10.10.100.1 (10.10.100.1)  28.550 ms  81.022 ms  80.970 ms
 2  192.168.0.1 (192.168.0.1)  80.915 ms  80.877 ms  80.831 ms


на этом настройка Филиала №1 закончена.



Установка и настройка OpenVPN Филиала №2 (Windows XP)


Будем настраивать гейт у филиала №2 на Windows XP. (Не забываемым расшарить сетевую карту на которую приходит интернет).

Качаем дистрибутив для Windows и устанавливаем его. Скачать











Копируем с сервера ключи в директорию C:\Program Files\OpenVPN\config
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/filial2.p12
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/ta.key


Далее создаем конфиг C:\Program Files\OpenVPN\config\filial2.ovpn
dev tun
proto udp
# IP сервера (основной канал)
remote 86.86.ххx.x
# IP сервера (резервный канал)
remote 90.90.xx.x
port 1194
client
resolv-retry infinite
pkcs12 filial2.p12
tls-client
tls-auth ta.key 1
auth SHA1
cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun
verb 3


Теперь нужно что бы служба OpenVPN стартовала с включением ПК
Топаем по пути
Пуск -> Панель управления -> Администрирование -> Службы









Попробуем теперь пингануть DNS сервер Офиса
C:\Users\Cancer>ping 192.168.0.1

Обмен пакетами с 192.168.0.1 по с 32 байтами данных:
Ответ от 192.168.0.1: число байт=32 время=28мс TTL=127
Ответ от 192.168.0.1: число байт=32 время=29мс TTL=127
Ответ от 192.168.0.1: число байт=32 время=28мс TTL=127
Ответ от 192.168.0.1: число байт=32 время=28мс TTL=127



Статистика Ping для 192.168.0.1:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь),
Приблизительное время приема-передачи в мс:
    Минимальное = 28мсек, Максимальное = 29 мсек, Среднее = 28 мсек

C:\Users\Cancer>


Ну и посмотрим трассировку
C:\Users\Cancer>tracert 192.168.0.1

Трассировка маршрута к pdc.domain.local [192.168.0.1]
с максимальным числом прыжков 30:

  1    32 ms    30 ms    27 ms  GATE [10.10.100.1]
  2    33 ms    31 ms    30 ms  pdc.domain.local [192.168.0.1]

Трассировка завершена.

C:\Users\Cancer>


на этом настройка Филиала №2 закончена.



Установка и настройка OpenVPN Филиала №3 (CentOS)

Будем настраивать гейт у филиала №3 на CentOS.

Подключаем epel репозиторий, инфа есть тут

Устанавливаем OpenVPN сервер.
[root@filial3 /]# yum -y install openvpn


Копируем с сервера ключи в директорию /etc/openvpn
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/filial3.p12
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/ta.key


Создаем конфигурационный файл
[root@filial3 /]# vi /etc/openvpn/filial3.conf

dev tun
proto udp
# IP сервера (основной канал)
remote 86.86.ххx.x
# IP сервера (резервный канал)
remote 90.90.xx.x
port 1194
client
resolv-retry infinite
pkcs12 filial3.p12
tls-client
tls-auth ta.key 1
auth SHA1
cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun
log-append /var/log/openvpn.log
verb 3


Теперь добавляем с помощью chkconfig OpenVPN в автозагрузку.
[root@filial3 /]# chkconfig openvpn on


Ну и теперь запускаем службу OpenVPN
[root@filial3 /]# service openvpn start
Запускается openvpn:                                       [  OK  ]
[root@filial3 /]#


Проверяем процесс
[root@filial3 /]# ps axw | grep openvpn

5953 ? Ss 0:00 /usr/sbin/openvpn --daemon --writepid /var/run/openvpn/filial3.pid --config filial3.conf --cd /etc/openvpn --script-security 2
5956 pts/0 S+ 0:00 grep openvpn


Попробуем теперь пингануть DNS сервер Офиса
[root@filial3 /]# ping -c 4 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=127 time=30.6 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=127 time=65.5 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=127 time=31.5 ms
64 bytes from 192.168.0.1: icmp_seq=4 ttl=127 time=31.7 ms

--- 192.168.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 30.651/39.875/65.579/14.845 ms


Ну и посмотрим трассировку
[root@filial3 /]# traceroute 192.168.0.1
traceroute to 192.168.0.1 (192.168.0.1), 30 hops max, 40 byte packets
 1  10.10.100.1 (10.10.100.1)  28.550 ms  81.022 ms  80.970 ms
 2  192.168.0.1 (192.168.0.1)  80.915 ms  80.877 ms  80.831 ms


Видим все нормально, пинги ходят.


на этом настройка Филиала №3 закончена.





Установка и настройка OpenVPN для системного администратора (Windows XP)


Будем настраивать на Windows XP.

Качаем дистрибутив для Windows и устанавливаем его. Скачать











Копируем с сервера ключи в директорию C:\Program Files\OpenVPN\config
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/sysadmin.p12
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server/ta.key


Далее создаем конфиг C:\Program Files\OpenVPN\config\sysadmin.ovpn
dev tun
proto udp
remote 86.86.ххx.x
port 1194
client
resolv-retry infinite
pkcs12 sysadmin.p12
tls-client
tls-auth ta.key 1
auth SHA1
cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun
verb 3


Запускаем OpenVPN GUI.exe
В появившейся иконке в трее, нажимаем Connect.



Далее видим, все нормально, подключились.



Пробуем пинговать офис и филиалы.





Отзыв сертификата клиента из базы данных



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

Переходим в директорию со скриптами
//> cd /usr/local/share/doc/openvpn/easy-rsa/2.0/


Запускаем shell
/usr/local/share/doc/openvpn/easy-rsa/2.0/> sh

#. ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on 
/usr/local/share/doc/openvpn/easy-rsa/2.0/keys/server


Запускаем скрипт отзыва сертификата клиента из базы данных revoke-full, где user1 имя сертификата клиента.
#./revoke-full user1
Using configuration from /usr/local/share/doc/openvpn/easy-rsa/2.0/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Revoking Certificate 09.
Data Base Updated
Using configuration from /usr/local/share/doc/openvpn/easy-rsa/2.0/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
user1.crt: /C=RU/ST=Rostov-on-Don/L=Rostov-on-Don/O=server/OU=server/CN=user1
/name=user1/emailAddress=user1@localhost
error 23 at 0 depth lookup:certificate revoked
# exit


После каждого отозванного сертификата, файл с отозванными сертификатами crl.pem копируем в /usr/local/etc/openvpn
//> cp /../../../../../easy-rsa/2.0/keys/server/crl.pem /usr/local/etc/openvpn


Обязательно нужно что бы права на файл были 644 (сделаем на всякий случай)
//> chmod 644 /usr/local/etc/openvpn/crl.pem


Указываем в конфиге server.conf файл с отозванными сертификатами.
//> ee /usr/local/etc/openvpn/server.conf

# указываем где находится файл отозванных сертификатов
crl-verify /usr/local/etc/openvpn/crl.pem


И перезагружаем сервер OpenVPN
//> /usr/local/etc/rc.d/openvpn restart






Подключение к OpenVPN по telnet

Тут опишу как можно подключатся удаленно к серверу и смотреть кто подключен в данный момент к нашему серверу
Подключаемся с PC администратора по telnet
telnet 192.168.0.x 8329

>INFO:OpenVPN Management Interface Version 1 — type 'help' for more info
status
OpenVPN CLIENT LIST
Updated,Tue Sep 14 10:13:04 2010
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
filial1,87.xxx.xxx.xx:57603,568651354,1418748913,Fri Sep 10 16:28:18 2010
filial2,83.xxx.xxx.xx:3705,20702,30886,Tue Sep 14 10:07:51 2010
filial3,62.xxx.xxx.xx:1041,685422,462374,Tue Sep 14 09:36:58 2010
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
192.168.1.1C,filial1,87.xxx.xxx.xx:57603,Tue Sep 14 10:13:04 2010
192.168.2.1C,filial2,83.xxx.xxx.xx:3705,Tue Sep 14 10:13:04 2010
192.168.3.1C,filial3,62.xxx.xxx.xx:1041,Tue Sep 14 10:13:00 2010
GLOBAL STATS
Max bcast/mcast queue length,0
END

Более подробный список команд тут

Есть отличная утилита OpenVPN-Control для подключения к OpenVPN. Скачать ее можно тут

Вот скрины программы

 












Настройка второго OpenVPN на одном сервере


Дописываю для тех кому вдруг нужно будет запустить на одном и том же сервере второй OpenVPN работающий на другом порту, например 65000 и протокол tcp.
Внимание!!!
Доступ на втором OpenVPN будет только к офису, дублировать роутнги на филиалы нельзя.

Переходим в директорию с демонами, копируем демон под другим названием openvpn2
//> cd /usr/local/etc/rc.d

/usr/local/etc/rc.d/> cp openvpn openvpn2

/usr/local/etc/rc.d/> ls | grep openvpn
openvpn
openvpn2


Далее создаем конфиг 2-го сервер OpenVPN
//> ee /usr/local/etc/openvpn/server2.conf

# указываем на каком локальном интерфейсе OpenVPN будет слушать
# по умолчанию OpenVPN слушает все интерфейсы
#local xxx.xxx.xx.x

# порт на котором работает сервер
port 65000

# протокол - TCP или UDP
proto tcp

# используемый тип устройства и номер
dev tun1

# указываем по каким интерфейсам можно подключаться к OpenVPN по telnet
# указывать нужно IP адреса интерфейсов сервера
# прошу заметить порт другой так как 8329 уже используется первым сервером
management localhost 8330
#management 192.168.0.xx 8330
#management 86.86.xxx.xx 8330

# указываем файл CA
ca /usr/local/etc/openvpn/keys/ca.crt

# указываем файл с сертификатом сервера
cert /usr/local/etc/openvpn/keys/server.crt

# указываем файл с ключем сервера
key /usr/local/etc/openvpn/keys/server.key

# указываем файл с генерированный алгоритмом Диффи Хеллмана
dh /usr/local/etc/openvpn/keys/dh2048.pem

# указываем где находится файл отозванных сертификатов
#crl-verify /usr/local/etc/openvpn/crl.pem

# задаем IP-адрес сервера и маску подсети (2-ой виртуальной сети)
# будьте внимательны виртуальная подсеть другая.
server 10.10.101.0 255.255.255.0

# указываем внутренний DNS и WINS сервер
push "dhcp-option DNS 192.168.0.1"
push "dhcp-option DNS 192.168.0.10"
push "dhcp-option WINS 192.168.0.1"

# задаем МАРШРУТ который передаём клиенту
# и маску подсети для того чтобы он "видел"
# сеть "Офиса" за OpenVPN сервером
# внимание доступа к филиалам не будет
# так как роутинги заняты будут 1-ым OpenVPN
push "route 192.168.0.0 255.255.255.0"

# указываем где хранятся файлы с
# настройками IP-адресов клиентов
client-config-dir ccd2

# добавляем маршрут сервер-клиент
route 10.10.101.0 255.255.255.252

# делает сервер OpenVPN основным шлюзом у клиентов
#push "redirect-gateway"

# разрешает видеть клиентам друг друга (по виртуальным IP)
# по умолчанию клиенты видят только сервер
client-to-client

# разрешать подключаться с одинаковым сертификатом/ключом
#duplicate-cn

# включаем TLS аутентификацию
tls-server

# для дополнительной безопасности при 
# использовании SSL/TLS, создайте "HMAC firewall"
# для защиты от DoS аттак и флуда UDP порта.
#
# сгенерируйте с помощью:
#   openvpn --genkey --secret ta.key
#
# сервер и каждый клиент должны иметь копию этого ключа.
# второй параметр выставляется в '0' для сервера и '1' для клиентов.
tls-auth keys/ta.key 0

# TLS таймаут, полезен если выход в интернет осуществляется
# через GPRS мобильных операторов
tls-timeout 120

# выбираем алгоритм хеширования по умолчанию используется SHA1
# вывод полного списка openvpn --show-digests
auth SHA1

# выберите криптографический сертификат.
# этот пункт конфига должен копироваться
# в конфиг клиента, так же как он установлен здесь.
# по умолчанию используется/рекомендуется BF-CBC
# вывод полного списка openvpn --show-ciphers
#cipher BF-CBC        # Blowfish (default)
#cipher AES-128-CBC   # AES
#cipher DES-EDE3-CBC  # Triple-DES
cipher BF-CBC

# проверяет активность подключения каждые 10 секунд,
# если в течении 120 сек. нет ответа, подключение закрывается
keepalive 10 120

# сжатия трафика VPN туннеля с помощью библиотеки LZO
# если вы включили сжатие на сервере,
# вы так же должны включить и в конфиге у клиента
comp-lzo

# максимальное количество одновременно подключенных клиентов
max-clients 100

# от какого пользователя и группы будет работать OpenVPN
user nobody
group nobody

# эти опции позволяют избежать необходимости
# получения доступа к определенным ресурсам
# после рестарта, т.к. это может быть невозможным
# из-за понижения привилегий.
persist-key
persist-tun

# путь к файлу записи статуса OpenVPN в лог
status /var/log/openvpn/openvpn2-status.log

# путь к файлу записи событий происходящих на сервере
# "log" - запись событий в лог будет перезаписываться при перезагрузке демона
# "log-append" - запись событий будет добавляться в лог
log /var/log/openvpn/openvpn2.log

# установите необходимый уровень логирования.
# 0 - ничего, за исключением фатальных ошибок
# 4 - подойдет для получения общих сведений
# 5 и 6 пригодяться для отладки проблем соединения
# 9 - максимально возможная информация
verb 3

# макс кол-во однотипных записей в лог
#mute 20


Создаем диру где можно клиентам задавать статический IP
//> mkdir /usr/local/etc/openvpn/ccd2

Создаем логи для второго сервера
//> touch /var/log/openvpn/openvpn2-status.log
//> touch /var/log/openvpn/openvpn2.log


Ну и создадим файл для выдачи статического IP сисадмину
//> ee /usr/local/etc/openvpn/ccd2/sysadmin

ifconfig-push 10.10.101.10 10.10.101.9


Добавляем второй OpenVPN в rc.conf
//> ee /etc/rc.conf

openvpn2_enable="YES"
openvpn2_if="tun"
openvpn2_configfile="/usr/local/etc/openvpn/server2.conf"
openvpn2_dir="/usr/local/etc/openvpn"


Запускаем его
//> /usr/local/etc/rc.d/openvpn2 start


Проверяем работу второго OpenVPN
//> sockstat | grep 65000
nobody   openvpn    89594 5  tcp4   *:65000               *:*
//>

//> ifconfig

должны увидеть следующее
tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 10.10.101.1 --> 10.10.101.2 netmask 0xffffffff
        Opened by PID 89587
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 10.10.100.1 --> 10.10.100.2 netmask 0xffffffff
        Opened by PID 29517




Список интерфейсных пар:
[  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]




Документация:
http://forum.ixbt.com/topic.cgi?id=14:40906
http://openvpn.net/index.php/open-source/documentation.html
http://openvpn.net/index.php/open-source/documentation/manuals.html
http://openvpn.net/management.html
http://www.lissyara.su/doc/man/safety/openvpn/



размещено: 2010-08-31,
последнее обновление: 2011-06-08,
автор: Cancer


WhitePawn, 2010-09-01 в 13:56:52

Пасиб Cancer.

Ludenus, 2010-09-06 в 0:51:04

Не раскрыта тема для одновременного подключения к одной точке 2 и более соединений. Весьма актуально для организации дублированных каналов от филиалов к офису и подключения к любой точке авторизованного админа по отдельному каналу. Есть в этой теме тонкостей куча, что во FreeBSD, что в Win.

riv1329, 2010-09-06 в 5:33:22

Немного не понял, а что за список интерфейсных пар, зачем он?

user, 2010-09-06 в 9:47:47

А офисы друг-друга видят?

Cancer, 2010-09-06 в 9:58:43

2user
Видят офисы друг друга!

2Ludenus
Вы о чем говорите, три филиала одновременно подключены к офису и все 4 подразделения видят друг друга.
А для того что бы админ подключаться мог, нужно всего лишь создать ключ и подключиться, не забыв в ccd выдать ему IP.

2riv1329
Это список IP адресов которые выдаются клиентам.
//> ee /usr/local/etc/openvpn/ccd/filial1
ifconfig-push 10.10.100.2 10.10.100.1


А вообще ребята давайте писать на форум
http://forum.lissyara.su/viewtopic.php?f=3&t=28289

pinger, 2010-09-06 в 10:24:55

Вот мой конфиг клиента, почему с машин находящихся за этим шлюзом я не могу пинговать ЦО?

dev tun
client
nobind
resolv-retry infinite
remote 80.xxx.xxx.xxx 1194
route 192.168.0.0 255.255.0.0
route 3.0.0.0 255.0.0.0
route 4.0.0.0 255.0.0.0
route 5.0.0.0 255.0.0.0
route 7.0.0.0 255.0.0.0
route 10.0.0.0 255.0.0.0
tls-client
route-method exe
route-delay 20
ca ca.crt
cert crt.crt
key key.key
proto tcp-client
comp-lzo
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 4

vlymar, 2010-09-07 в 9:36:04

Работает! Спасибо автору.

Cancer, 2010-09-07 в 13:13:16

2Ludenus
Весьма актуально для организации дублированных каналов от филиалов к офису и подключения к любой точке авторизованного админа по отдельному каналу.

А что вы именно имели ввиду ?

Cancer, 2010-09-10 в 0:21:34

Обновил статью до версии OpenVPN 2.1.3

Тестирую, работает все пока что отлично!

Alex, 2010-09-12 в 11:19:43

По вопросу про интерфейсные пары: в версии 2.1 появилась интересная опция --topology subnet при которой клиентам уже не выделяется отдельная подсеть /30 (что и отражают эти интерфейсные пары).
Опция работает и под Windows

*, 2010-09-28 в 1:47:18

Вечер добрый
сразу извиняюсь за ниже изложенное
[ЦЕНЗУРА] под 1С впн поднимать
этож надо додуматься
вы знаете сколько трафика жрет 1С? много
не прощеле было бы терминальник поднять?
это так к слову об оптимизации
схема ужасная или перересуйте или удалите

Cancer, 2010-09-28 в 9:11:32

Батенька научитесь читать!
чтобы люди могли подключаться через RDP к базам 1С на серверах
RDP наверное вам ни о чем не говорит?

ail-man, 2010-10-15 в 11:47:19

Оч.полезная статья, поэтому респект автору! У самого подобное настроено для 8 филиалов и успешно работает вот уже год, и пользователи работают в терминалах =)
По поводу:

\"Не раскрыта тема для одновременного подключения к одной точке 2 и более соединений. Весьма актуально для организации дублированных каналов от филиалов к офису...\"

, - достаточно на клиентах прописать еще одну строчку remote с резервным IP сервака, если основной упадет. Все идеально работает! Проверенно на схеме с сервером и клиентами, имеющими по 2 канала с переключением на резерв.
А по-поводу \"подключения к любой точке авторизованного админа по отдельному каналу\" - смысл вопрос не ясен. Делаем админу сертификат и подключаем к серваку - все! Доступ всюду и везде ему обеспечен. Не так ли? ;)

Единственный минус такой схемы - весь траффик будет проходить через сервак (если, например, нам надо с одного филиала попасть в другой через этот VPN), поэтому на нем нужен достаточно широкий канал. Так же добавлю, что для удобства работы в терминале время отклика до впн-сервера со всех филиалов должно быть достаточно малым (хотя бы порядка 50 мс), иначе нервов не хватит :)

Cancer, 2010-10-15 в 13:22:00

2ail-man
Окей, добавлю в статью про
remote IP_основного канала сервера
remote IP_резервного канала сервера


Так же добавлю, что для удобства работы в терминале время отклика до впн-сервера со всех филиалов должно быть достаточно малым (хотя бы порядка 50 мс
Если сделать 8 бит ограничение для терминальной сессии то и на 130-180 мс нормально работает.

ail-man, 2010-10-15 в 14:44:41

согласен, ну все же более комфортно на 50 мс, особенно при редактировании текста ;)
А вообще хорошо, если филиалы на одном провайдере сидят, и тогда время отклика зачастую порядка 5мс (правда не у всех провайдеров так), и тогда как будто локально сидишь =)

Cancer, 2010-10-18 в 0:29:55

В OpenVPN 2.1 на стороне клиента как оказывается можно вместо
remote 86.86.xxx.x
port 1194
proto udp

сделать так
remote host [port] [proto]
remote 86.86.xxx.x 1194 udp

kolesya, 2010-12-06 в 13:30:07

push "route 192.168.0.0 255.255.255.0"
...
push "route 192.168.3.0 255.255.255.0"

Раньше были ограничения на размер передаваемых через push данных на клиента (~1024 байта)

Cancer, 2010-12-06 в 14:14:44

Это очень хорошо!
Я так понял это изменение коснулась серверной части!

adre, 2010-12-07 в 22:42:30

Шикарно.... =)

novichok, 2011-01-14 в 17:06:53

У меня вопрос не по теме. А как быть с реализацией 152-ФЗ? Очень, знаете ли, актуально сейчас.

savio, 2011-01-18 в 15:42:07

Нда... устал листать, не то что читать. Молодец!

Cancer, 2011-03-09 в 13:59:41

Статью переписал слегка, под работу с более большим размером ключей.

export KEY_SIZE=2048

Dima, 2011-03-14 в 22:29:28

В сети стоят два DC с адресами (192.168.0.1 и 0.2)
Настроил подключение по инструкции.
Подключаюсь нормально, но пингуется только 0.2.
Решилось сменой адреса виртуальной сети с 10.10.100.0 на 10.8.0.0 (как в дефолотовом конфиге)

Artem, 2011-04-29 в 15:28:14

to novichok
смотря в каком аспекте рассматривать! насколько я понял 152, то для соединения 2 оффисов вы конечно же можете использовать OpenVPN, но как систему защиты данных - нет. насколько мне известно, OpenVPN не является сертифицированным ФСТЭКом средством защиты!

Аслан, 2011-06-28 в 15:08:29

Автору огромное уважение и поклон! Я только учу FreeBSD, потому этот ресурс моя домашняя страница. Если кто сталкивался с проблемой ввода пароля на клиенте установленной FreeBSD в этом месте  +--------------------------------------------------------------------+
    |                   Options for openvpn 2.1.4                        |
    | +----------------------------------------------------------------+ |
    | |  [Х] PW_SAVE  Interactive passwords may be read from a file    | |
    | |  [ ] PKCS11   Use security/pkcs11-helper                       | |
    | |                                                                | |
    | |                                                                | |
    | |                                                                | |
    | |                                                                | |
    | |                                                                | |
    +-+------v(+)------------------------------------------------------+-+
    |                       [  OK  ]       Cancel                        |
    +--------------------------------------------------------------------+
ставьте галку, тогда в конфиге askpass будет работать, иначе 0. На линукс машинах при конфигурации ставим ./configure -enable-password-save, если ошибился, поправьте, я не русский.

Dzhan Zabilov, 2011-08-15 в 11:26:46

Замечательная статья! И как тебе только не лень было писать столь обьемный материал;-). Вспомнилось как на духу, когда 3 года назад все это настраивал и подсказать некому было;-).

Вопрос - openvpn сертифицирован под фз152?

Cancer, 2011-11-03 в 12:11:52

скорее всего openvpn не сертифицирован ФСТЭК-ом.

dimasik_s, 2012-01-22 в 8:13:06

Автору уважение!
Маленькая поправка:
если вы работаете в папке 2.0, то
#./build-key-server server
работать не будет.
Надо четко указать что работаем в sh
#sh ./build-key-server server
И все нормально создается )))

Рамиль, 2012-02-07 в 13:59:50

Господа вот еще один вариант настройки клиента к статье
http://www.arg.su/ru-RU/Asus-WL-500G-Premium-v2-OpenVPN-Tomato

Cancer, 2012-02-07 в 17:41:46

Спасибо вам Рамиль! Отличный вариант!
Ссылку поправил....

dms, 2012-03-13 в 1:27:33

OpenVPN на Windows при попытке подключиться наблюдаю в логах такое:                                     UDPv4: Connection reset by peer (WSAECONNRESET)(code=10054).Куда копать?

smkuzmin, 2012-06-06 в 21:43:55

Простая установка сервера OpenVPN на CentOS: [url=https://sites.google.com/site/smkuzmin/home/openvpn]

Дмитрий, 2012-09-12 в 2:44:27

Статический IP можно прописать клиенту по другому,
есть директива ifconfig-pool-persist ipp.txt.
Файл ipp.txt нужно редактировать когда сервис openvpn остановлен, после запуска сервиса клиенты будут получать тот IP что указан в файле.

Формат файла ipp.txt:

commonName,ip

Как я понимаю разные демоны нужны только для возможности запуска разных серверов, в противном случае можно использовать следующий скрипт запуска(оговорка: cкрипты и команды далее - тестировались на CentOS 6.3):

#!/bin/sh
# openvpn config
dir=/etc/openvpn
# подгружаем модуль в ядро если он не включен
modprobe tun
# Включаем форвардинг пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward
# Запускаем в режиме демонов три сервера
openvpn --cd $dir --script-security 2 --daemon --config /etc/openvpn/server_1.conf
openvpn --cd $dir --script-security 2 --daemon --config /etc/openvpn/server_2.conf
openvpn --cd $dir --script-security 2 --daemon --config /etc/openvpn/server_3.conf


Опция(--script-security level) появилась с версии 2.1.
Можно указать как при запуске демона так и в файле *.conf сервера. Что она даёт:

Это Директива предлагает уровень политики контроля над OpenVPN, использование внешних программ и скриптов.

Настройки уровней:

0 — Строго без вызова внешних программ.
1 — (по умолчанию), Только вызов встроенных комманд, таких как ifconfig, ip, route, или netsh.
2 — Позволяет вызывать встроенные комманды и пользовательские скрипты.
3-Разрешет пароли, которые должны быть переданы в скриптах
через переменные окружения(потенциально небезопасно).

Сам до конца не могу подобрать первод 3-го уровня, приведу пример на буржуйском так наверное будет понятнее(Allow passwords to be passed to scripts via environmental variables (potentially unsafe).

$ps -A | grep openvpn

покажет процессы там должно быть что-то такого типа:

27195 ?        00:00:03 openvpn
27204 ?        00:00:01 openvpn
27212 ?        00:00:00 openvpn


в конфиге сервера можно ипользуйте директиву:

writepid /etc/openvpn/pid_server_1

Этой командой получим ID процесса не открывая файла(при этом находимся в каталоге с файлом или указываем полный путь к файлу)

$cat pid_server_1

полученный ответ

27289

если этот процес нужно убить то набираем это:

$kill  27289

или убиваем все процесы openvpn следующим скриптом:

создаём пустой файл скрипта

$touch stop-openvpn.sh

$nano stop*

работает и так и так

$nano stop-openvpn.sh

Вставляем код в файл:

#!/bin/sh

# stop all openvpn processes

killall -TERM openvpn


Делаем файл исполняемым:

$chmod +x stop.sh

P.S. Хотел написать только про статические IP, а пока добавлял строчки из своих настроек, заметил что есть у Вас упоминание о скриптах безопастности но ничего не пишется что к чему. На CentOS 6.3 у меня кстати переменные окружения для ключей загружаются вот так:

$source ./vars

Дмитрий, 2012-09-12 в 2:52:05

Виноват упустил имя файла, должно быть не так:

Делаем файл исполняемым:

$chmod +x stop.sh

а вот так(файл то создавали вот такой stop-openvpn.sh)

$chmod +x stop-openvpn.sh

но если файлов начинающихся на stop в каталоге больше нет то можно и так..))):

$chmod +x stop*

Evg, 2012-10-15 в 19:03:33

Дмитрий, Ман по поводу вашего замечания имеет другое мнение:

Note that the entries in this file are treated by OpenVPN as  suggestions  only,  based  on  past associations  between  a common name and IP address.  They do not guarantee that the given common name will always receive the given IP address.  If you want guaranteed assignment,  use  --ifconfig-push

Особенно учитывая то что я выделил жирным я все же предпочел бы использовать --ifconfig-push

Дмитрий, 2012-10-15 в 22:30:08

Evg, если не сложно переведите пожалуйста и приведите ман весь целиком для этой директивы.

Evg, 2012-10-16 в 15:07:40

Сохранение/удаление  данных ifconfig-pool в файл, на интервал в секундах (по умолчанию = 600) как при старте так и при завершении программы.
(Строго говоря слова такого unpersist вроде как нет, в общем мог перевести неправильно особенно вторую часть предложения)
Цель данной опции предоставить долговременную ассоциацию между клиентами и виртуальными IP адресами назначенными им из пула (настройки ifconfig-pool).Поддержание долговременной ассоциации полезно для клиентов так как позволяет им эффективно использовать директиву --persist-tun.
Параметр file - это ASCII файл с разделителями-запятыми имющий вид <Common-Name>,<IP-address>.
Если значение [seconds] = 0 файл будет обрабатываться как доступный только для записи.
Обратите внимание что записи в данном файле для OpenVPN'а носят рекомендательный характер, основанный на прошлый ассоциациях между Common Name и IP адресом. Эти записи не гарантируют что клиент с указанным "common name" всегда будет получать указанный для него в файле IP адрес.
Если вы хотите гарантированного присвоения, используйте директиву --ifconfig-push

Evg, 2012-10-16 в 15:12:26

Только что перечитал вашу просьбу и понял что неверно истрактовал вашу просьбу, тогда читайте начиная с "Обратите внимание".
А вот собственно оригинал:

--ifconfig-pool-persist file [seconds]
Persist/unpersist  ifconfig-pool data to file, at seconds intervals (default=600), as well as on program startup and shutdown.
The goal of this option is to provide  a  long-term  association  between  clients(denoted  by  their  common name) and the virtual IP address assigned to them from the ifconfig-pool.  Maintaining  a  long-term  association  is  good  for  clients because it allows them to effectively use the --persist-tun option. file is a comma-delimited ASCII file, formatted as <Common-Name>,<IP-address>.

If  seconds  =  0, file will be treated as read-only.  This is useful if you would like to treat file as a configuration file.

Note that the entries in this file are treated by  OpenVPN  as  suggestions  only, based  on  past  associations  between  a common name and IP address.  They do not guarantee that the given common name will always receive the given IP address.  If you want guaranteed assignment, use --ifconfig-push

Дмитрий, 2012-10-17 в 4:04:34

Evg, Прошу прощения но хотелось бы всё таки правильный перевод:

If  seconds  =  0, file will be treated as read-only.  This is useful if you would like to treat file as a configuration file.

Хочу заметить что я не претендую на едиственно правильный вариант..)))...а всего лишь указал что такой вариант имеет место быть!

Дмитрий, 2012-10-17 в 4:15:27

Чтобы никого не путать, от себя добавлю если хотите использовать директиву ifconfig-pool-persist ipp.txt как конфигурационный файл то её нужно записывать в следующем формате:

ifconfig-pool-persist ipp.txt 0

редактируем файл остановив демон opnvpn. Лично для меня это удобнее, но если нужно строго задать IP на клиенте от сервера, то нужно использовать другую директиву "--ifconfig-push".

Evg, 2012-10-17 в 10:22:08

Да, видимо при переводе я пропустил это предложение.

Кирилл, 2013-01-15 в 9:08:04

при выполнении
/../../../../openvpn/easy-rsa/2.0/> openvpn --genkey --secret keys/server/ta.key
пишет
openvpn: Command not found.

Cancer, 2013-01-16 в 15:06:13

Полный путь попробуйте указать
/usr/local/sbin/openvpn --genkey --secret keys/server/ta.key

Евгений, 2013-02-13 в 12:43:08

Добрый день.
Хочу обратить внимание коллег, что при создании ключей для филиалов, обратите внимание на атрибут CommonName. Его содержимое в последствии должно использоваться в имени файла настрое к в /usr/local/etc/openvpn/ccd/. Если содержимое CommonName и Имя файла настроек отличаются, то из главной сети вы не будете видеть сеть за клиентом.

Devapath, 2013-03-05 в 17:48:06

OpenVPN+Mikrotik.
www.youtube.com/watch?v=L45nsdE9220
www.youtube.com/watch?v=pEUiE0gdX04
Но в видео есть ошибка, нельзя сохранять в Mikrotik файл ca.key !!!
Не наступайте на мои грабли. Создавая интерфейс OpenVPN, устанавливайте параметры: Certificate, Auth, Cipher - единожды. Иначе будут ошибки соединения. Если параметры нужно изменить. Создайте интерфейс заново.
В принципе тут все расписано:
wiki.mikrotik.com/wiki/OpenVPN
openvpn.net/index.php/open-source/documentation/howto.html

Devapath, 2013-03-19 в 10:52:14

OpenVPN+Mikrotik!!!
Если у вас проблемы со связкой микротика, обновите ОС и прошивку.
Заработало СТАБИЛЬНО при таком обновлении:
- MikroTik RouterOS 5.24
- Current Firmware: 3.02
Проверял на нестабильном канале :-)
Особенность, MikroTik работает только с TCP (в OpenVPN) !!! В конфиге укажите:
proto tcp

Tihonov Dmitry, 2013-03-24 в 19:32:30

!!! Новая фича в openvpn-2.3.0_3
Если устанавливать openvpn из портов с опцией
Install security/easy-rsa RSA helper package то скрипты по генерации ключей и сертификатов "ложатся" в /usr/local/share/easy-rsa/

MIf, 2016-05-13 в 17:42:54

Автору огромное спасибо! И, если позволите, небольшой вопросик, а может ли центральный сервер OVPN выступать одновременно клиентом, подключенным к следующему серверу OVPN ?

Cancer, 2016-05-13 в 17:47:17

Добрый день!
Да, конечно, не вижу проблем.
У меня на одной машине 2 экземпляра сервера поднято и 1 клиентское подключение и это все на Win сервере, а там чуть сложнее это сделать было.

MIf, 2016-05-16 в 16:11:50

Отлично! Большое спасибо, полез дальше читать документацию.

Pavel, 2023-08-02 в 20:10:00

>Доступ на втором OpenVPN будет только к офису, дублировать роутнги на филиалы нельзя.
Посмею не согласиться.
Маршрутизацию между клиентами openvpn осуществляет сам, для этого есть параметр iroute.
Благодаря ему openvpn знает, что если пакет адресован 192.168.3.0/24, и у одного из клиентов указан iroute 192.168.3.0/24, то именно туда openvpn этот пакет и отправит.
А дальше этот пакет выйдет из интерфейса tun0, и дальше пойдет согласно таблице маршрутизации OS.
Если есть второй openvpn сервер:
Он должен сделать push "route ...." своим клиентам, что, мол, я умею доставлять данные до адресов X.Y.Z.* .
Пакет придет в tun1, попадет в OS, которая согласно таблице маршрутизации отправит пакет в tun0, где он, согласно iroute будет отправлен нужному клиенту.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1005 секунд
Из них PHP: 68%; SQL: 32%; Число SQL-запросов: 93 шт.
Исходный размер: 247205; Сжатая: 35217