Установка OpenVPN
29-10-2010. Разместил: synergix

По адресации
MAIN OFFICE - LAN 192.168.0.0/24, WAN 213.230.x.x
FILIAL1 - 192.168.1.0/24, WAN 213.230.x.x
FILIAL2 - 192.168.2.0/24, WAN 213.230.x.x
Было решено объединить сети используя OpenVPN. Почему OpenVPN?
1. OpenVPN - кроссплатформенное программное обеспечение, а для меня это очень важно, так как на гейтах филиалах находятся разные операционные системы.
OpenVPN используется на Solaris, OpenBSD, FreeBSD, NetBSD, GNU/Linux, Apple Mac OS X, QNX и Microsoft Windows.
2. Нужно видеть всю сеть за гейтом филиала и обратно, а именно объединить все подсети.
3. Компрессия с помощью библиотеки компрессии LZO, для сжатия потока данных.
4. Шифрование канала, для обеспечения безопасности управляющего канала и потока данных, OpenVPN использует библиотеку OpenSSL.
В офисе в качестве шлюза работала FreeBSD, она же и будет выступать сервером OpenVPN. В филиалах одна сеть имела гейт на FreeBSD, вторая на Win. Также решено было предусмотреть подключение администратора для контроля.
Начнем установку:
#cd /usr/ports/security/openvpn
#make install clean
При установке выведется окошко конфигурирования, там ничего отмечать не надо. При этом выкачается портов примерно на 2-3 мегабайта.
Далее:
#cd /usr/local/share/doc/openvpn/easy-rsa/2.0/
#ee vars
И в нем редактируем одну строчку
# Меняем export KEY_DIR="$EASY_RSA/keys" на
export KEY_DIR="$EASY_RSA/keys/server"
Даем на скрипты права на исполняемость r-xr--r--
#chmod 544 *
Создаем директорию куда у нас будут создаваться/храниться ключи и сертификаты.
#mkdir -p keys/server
Далее запускаем shell
#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
На этом предварительную настройку и установку можно считать законченной.
Генерация ключей.
Создаем 2 ключа (ca.key и dh1024.pem) и 1 сертификат (server.key) только для сервера OpenVPN и дополнительный ключ (ta.key) для сервера и клиента.
1. Создаем 1-ый ключ Certificate Authority
# ./build-ca
Generating a 1024 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]:UZ
State or Province Name (full name) [CA]:Navoi
Locality Name (eg, city) [SanFrancisco]:Navoi
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]:synergix@localhost
#
2. Создаем сертификат X.509
# ./build-key-server server
Generating a 1024 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]:UZ
State or Province Name (full name) [CA]:Navoi
Locality Name (eg, city) [SanFrancisco]:Navoi
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]:synergix@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:'UZ'
stateOrProvinceName :PRINTABLE:'Navoi'
localityName :PRINTABLE:'Navoi'
organizationName :PRINTABLE:'server'
organizationalUnitName:PRINTABLE:'server'
commonName :PRINTABLE:'server'
name :PRINTABLE:'server'
emailAddress :IA5STRING:'synergix@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. Генерируем 1024 битный ключ с помощью алгоритма Диффи Хеллмана.
# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
...............................+.......+..............................++*++*++*
#
И выходим из shell
# exit
4. Создаем TLS-ключ (который нужен как и серверу, так и клиенту)
#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/etc/openvpn/keys
#cp ca.crt /usr/local/etc/openvpn/keys/
#cp server.crt /usr/local/etc/openvpn/keys/
#cp server.key /usr/local/etc/openvpn/keys/
#cp dh1024.pem /usr/local/etc/openvpn/keys/
#cp ta.key /usr/local/etc/openvpn/keys/
Файл конфигурации.
Создаем конфигурационный файл нашего 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 213.230.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/dh1024.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"
# указываем где хранятся файлы с
# настройками 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
# делает сервер OpenVPN основным шлюзом
#push "redirect-gateway def1"
# разрешает видеть клиентам друг друга (по виртуальным IP)
#client-to-client
# разрешать подключаться с одинаковым сертификатом/ключом
#duplicate-cn
# включаем TLS аутентификацию
tls-server
# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth keys/ta.key 0
# TLS таймаут
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: filial1.p12, filial2.p12.
pkcs12 имя файла в формате PKCS#12, содержащего сертификат CA, ключ и сертификат клиента.
Такой файл и команда заменяют сразу 3 соответствующих файла и команды - .ca, .cert, .key
#cd /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 1024 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]:UZ
State or Province Name (full name) [CA]:Navoi
Locality Name (eg, city) [SanFrancisco]:Navoi
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:'UZ'
stateOrProvinceName :PRINTABLE:'Navoi'
localityName :PRINTABLE:'Navoi'
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 1024 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]:UZ
State or Province Name (full name) [CA]:Navoi
Locality Name (eg, city) [SanFrancisco]:Navoi
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:'UZ'
stateOrProvinceName :PRINTABLE:'Navoi'
localityName :PRINTABLE:'Navoi'
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:
#
Создаем ключ для cистемного администратора
# ./build-key-pkcs12 sysadmin
Generating a 1024 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]:UZ
State or Province Name (full name) [CA]:Navoi
Locality Name (eg, city) [SanFrancisco]:Navoi
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:'UZ'
stateOrProvinceName :PRINTABLE:'Navoi'
localityName :PRINTABLE:'Navoi'
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
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
Системный администратор
#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
Для IPFW
ipfw add allow udp from any to me 1194 via $ext_ip
Установка и настройка OpenVPN Филиала №1 (FreeBSD)
Будем настраивать гейт у филиала №1 на FreeBSD
#cd /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
/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
/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:>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:>
Ну и посмотрим трассировку
C:>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:>
На этом настройка Филиала №2 закончена.
Настройка компьютера администратора ничем не отличается от способов описанных для первого или второго филиалов.
На этом настройку OpenVPN можно считать законченной.
Вернуться назад