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

Автор: Cancer.

На днях появилась задача - объединить головной офис и 3 филиала в одну сеть через интернет посредством OpenVPN, чтобы люди могли подключаться через RDP к базам 1С на серверах, а, в свою очередь, админы имели удаленный доступ к ПК филиалов по 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.

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

Схема сети:

Устанавливаем 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 def1"

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

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

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

# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth keys/ta.key 0

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

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

# выбираем алгоритм шифрования пакетов по умолчанию используется/рекомендуется BF-CBC вывод полного списка openvpn --show-ciphers
cipher BF-CBC

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

# сжатия трафика с помощью библиотеки LZO
comp-lzo

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

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

# не перечитывать ключи после получения
# SIGUSR1 или ping-restart
persist-key

# не закрывать и переоткрывать TUNTAP устройство, после получения SIGUSR1 или ping-restart
persist-tun

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

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

# уровень информации для отладки
# 0 -- quiet except for fatal errors.
# 1 -- mostly quiet, but display non-fatal network errors.
# 3 -- medium output, good for normal operation.
# 9 -- verbose, good for troubleshooting
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 FilesOpenVPNconfig

/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 FilesOpenVPNconfigfilial2.ovpndev 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:UsersCancer>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:UsersCancer>

Ну и посмотрим трассировку

C:UsersCancer>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:UsersCancer>

на этом настройка Филиала №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 FilesOpenVPNconfig/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 FilesOpenVPNconfigsysadmin.ovpndev 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 администратора по telnettelnet 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 адреса интерфейсов сервера
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 def1"

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

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

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

# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth keys/ta.key 0

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

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

# выбираем алгоритм шифрования пакетов по умолчанию используется/рекомендуется BF-CBC вывод полного списка openvpn --show-ciphers
cipher BF-CBC

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

# сжатия трафика с помощью библиотеки LZO
comp-lzo

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

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

# не перечитывать ключи после получения SIGUSR1 или ping-restart
persist-key

# не закрывать и переоткрывать TUNTAP устройство, после получения SIGUSR1 или ping-restart
persist-tun

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

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

# уровень информации для отладки
# 0 -- quiet except for fatal errors.
# 1 -- mostly quiet, but display non-fatal network errors.
# 3 -- medium output, good for normal operation.
# 9 -- verbose, good for troubleshooting
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/management.html

Обновлено: 12.03.2015