Установка и настройка OpenVPN

В данной статье описывается один из методов организации доступа к локальным ресурсам удаленной сети посредством технологии VPN. Я знаю всего пару хороших VPN серверов, работающих под FreeBSD, которые позволяют решить широкий круг задач: MPD и OpenVPN. Каждый из них обладает своими достоинствами и недостатками, поэтому выбирать какой ставить, следует в зависимости от поставленной задачи. К примеру, с помощью MPD можно сделать VPN сервер, авторизующий клиентов только по паре логин/пароль, к которому можно подключиться стандартными средствами Windows. В тоже время для подключения к OpenVPN, клиенту будет необходим, как минимум, определенный сертификат, а так же одноименное клиентское приложение. Зато OpenVPN позволяет организовать соединение, которое работает на втором уровне сетевой модели OSI, что открывает доступ для широковещательного трафика. Именно поэтому был выбран сервер OpenVPN для решения следующей задачи: организация доступа пользователям к локальным ресурсам удаленной сети, с возможностью циркуляции по соединению широковещательного трафика.

Итак, идем в порты и устанавливаем OpenVPN. На момент написания статьи в портах доступен сервер версии 2.2.2. В окне параметров сборки я ничего не изменял.

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

Далее необходимо создать сертификаты для сервера и нарисовать конфигурационный файл. Для создания сертификатов с портом также ставится набор скриптов, который находится тут - /usr/local/share/doc/openvpn/easy-rsa/2.0. Для удобства, я скопировал их в папку с конфигурационными файлами OpenVPN - /usr/local/etc/openvpn.

mkdir /usr/local/etc/openvpn/easy-rsa
cp -R /usr/local/share/doc/openvpn/easy-rsa/2.0 /usr/local/etc/openvpn/easy-rsa

Теперь надо отредактировать конфигурационный файл для скриптов - /usr/local/etc/openvpn/easy-rsa/vars. Я изменил только эти параметры:

# Если у вас паранойя, то увеличьте это значение до 2048 бит.
# Это замедлит процесс согласования TLS и генерацию
# ключа Диффи-Хеллмана.
export KEY_SIZE=1024

# Время жизни сертификатов.
export CA_EXPIRE=9999
export KEY_EXPIRE=9999

# Эти значения используются при создании сертификатов.
# Они всегда должны быть заданы.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Russia"
export KEY_CITY="Yekaterinburg"
export KEY_ORG="www.example.org"
export KEY_EMAIL="nekit@info-x.org"
export KEY_CN="vpn.example.org"
export KEY_NAME="Nekit"

Теперь можно приступить к созданию сертификатов. Для этого переключаемся в стандартную оболочку и инициализируем переменные окружения. Все действия осуществляются в директории - /usr/local/etc/openvpn/easy-rsa.

### Переключаемся в стандартную оболочку
# sh

### Инициализируем переменные окружения
# . ./vars
# ./clean-all

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

# ./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) [RU]:
State or Province Name (full name) [Russia]:
Locality Name (eg, city) [Yekaterinburg]:
Organization Name (eg, company) [www.example.org]:
Organizational Unit Name (eg, section) [none]:
Common Name (eg, your name or your server's hostname) [vpn.example.org]:
Name [Nekit]:
Email Address [nekit@info-x.org]:

Генерируем сертификат и ключ для сервера:

# openvpn --genkey --secret /usr/local/etc/openvpn/easy-rsa/keys/ta.key
# ./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) [RU]:
State or Province Name (full name) [Russia]:
Locality Name (eg, city) [Yekaterinburg]:
Organization Name (eg, company) [www.example.org]:
Organizational Unit Name (eg, section) [none]:
Common Name (eg, your name or your server's hostname) [server]:
Name [Nekit]:
Email Address [nekit@info-x.org]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/local/etc/openvpn/test/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'Russia'
localityName          :PRINTABLE:'Yekaterinburg'
organizationName      :PRINTABLE:'www.example.org'
organizationalUnitName:PRINTABLE:'none'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'Nekit'
emailAddress          :IA5STRING:'nekit@info-x.org'
Certificate is to be certified until Jan 13 16:39:10 2040 GMT (9999 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

Генерируем ключ Диффи-Хеллмана:

# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
........+.............................................+........

Все файлы после работы скриптов помещаются в директорию keys. Теперь можно переходить к настройке сервера. Приводим файл /usr/local/etc/openvpn/server.conf примерно к такому виду:

# На каком IP адресе сервер будет принимать соединения от клиентов.
# Можно не задавать, тогда сервер будет принимать подключения на всех интерфейсах.
;local a.b.c.d

# На какой порт принимать соединения?
port 1194

# TCP или UDP сервер?
;proto tcp
proto udp

# "dev tun" создаст маршрутизируемый IP туннель.
# "dev tap" создаст Ethernet туннель.
# Укажите здесь, например, "dev tap0", если вам нужно сделать мост.
# Также вам нужно будет перед запуском сервера создать интерфейс
# с таким же именем.
dev tap0
;dev tun

# Корневой сертификат SSL/TLS. Сервер и каждый клиент должны иметь 
# собственные сертификаты и ключи. Но корневой сертификат (только он)
# один для всех.
ca /usr/local/etc/openvpn/easy-rsa/keys/ca.crt
cert /usr/local/etc/openvpn/easy-rsa/keys/server.crt
key /usr/local/etc/openvpn/easy-rsa/keys/server.key

# Ключ Диффи-Хеллмана.
dh /usr/local/etc/openvpn/easy-rsa/keys/dh1024.pem

# Данный параметр говорит OpenVPN работать в качестве сервера
# и использовать указанную здесь подсеть. Первый из подсети адрес
# сервер возьмет себе, остальные же будут выдаваться клиентам.
# Закомментируйте данный параметр, если вам нужен режим моста.
#server 10.8.0.0 255.255.255.0

# В этом файле сервер сохраняет данные вида: клиент <-> IP адрес.
# Если сервер аварийно завершится, то после возобновления работы
# сервера, восстановивший соединение клиент получит тот же
# IP адрес, который был до обрыва.
#ifconfig-pool-persist ipp.txt

# Включить режим сервера для моста. Только сначала вам необходимо
# подготовить в ОС мост и добавить в него TAP интерфейс. Здесь
# указывается 4 параметра: IP и маска моста, а также пул адресов,
# адреса из которого будут выданы клиентам.
#server-bridge 192.168.7.250 255.255.255.0 192.168.7.51 192.168.7.100

# Смысл такой же, как и в предыдущем параметре, только выдачей
# адресов клиентам будет заниматься DHCP сервер (должен быть настроен отдельно).
server-bridge nogw

# Маршруты, которые будут добавлены на клиентской машине
# при подключении.
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"

# Если раскомментировать данный параметр, то для клиентов
# эта машина будет шлюзом по умолчанию.
;push "redirect-gateway def1 bypass-dhcp"

# Можно передать клиенту дополнительные параметры для сетевого
# подключения, например адреса DNS или WINS серверов.
# За дополнительной информацией идти по этой ссылке:
# http://openvpn.net/faq.html#dhcpcaveats
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"

# Раскомменитруйте данный параметр, чтобы клиенты могла видеть
# друг друга. По умолчанию клиенты могут отправлять запросы
# только серверу.
client-to-client

# Раскомментируйте данный параметр, если вы хотите разрешить
# подключение нескольких клиентов с одинаковым значением поля
# Common Name в сертификате.
duplicate-cn

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

# Для дополнительной безопасности (block DoS attacks and
# UDP port flooding) сгенерируйте ключ командой
#   openvpn --genkey --secret ta.key
# и укажите путь к нему здесь. Второй параметр должен быть
# '0' для сервера и '1' для клиента.
tls-auth /usr/local/etc/openvpn/easy-rsa/keys/ta.key 0 # This file is secret

cipher BF-CBC        # Blowfish (default)
;cipher AES-128-CBC   # AES
;cipher DES-EDE3-CBC  # Triple-DES

# Разрешить компрессию трафика по соединению.
# Если включено на сервере, то у клиента тоже должно быть.
comp-lzo yes

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

# Группа и пользователь, под которыми будет работать демон сервера.
user nobody
group nobody

persist-key
persist-tun

# Выводить информацию о текущих подключениях в данный файл.
# Файл обнуляется каждую минуту, а запись идет с самого начала.
status /var/log/openvpn/openvpn-status.log

# Писать логи в файл.
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log

# Уровень отладки:
# 0 - выводятся только фатальные ошибки
# 4 - рекомендуется
# 5 и 6  - помогут при отладке
# 9 - выводится все подряд
verb 3

# Не больше указанного здесь количества одинаковых (повторяющихся)
# сообщений будет выведено в файл.
;mute 20

Стоит обратить внимание на выбранный сетевой интерфейс tap (который эмулирует канал Ethernet), именно по нему может циркулировать широковещательный трафик. После создания конфига необходимо разрешить в /etc/rc.conf запуск OpenVPN при старте системы, а также настроить автоматическое создание и конфигурирование интерфейсов bridge и tap. Сначала добавляем необходимые модули в /boot/loader.conf:

if_bridge_load="YES"
if_tap_load="YES"

Теперь делаем примерно такие записи в /etc/rc.conf:

cloned_interfaces="bridge0 tap0"
ifconfig_nfe0="up"
ifconfig_tap0="up"
ifconfig_bridge0="inet 192.168.7.250 netmask 0xffffff00 broadcast 192.168.7.255 addm nfe0 addm tap0"

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

Чтобы не перезагружать компьютер можно выполнить следующие команды, которые создают мост, добавляют в него интерфейсы и запускают OpenVPN:

# kldload if_tap
# kldload if_bridge

# ifconfig tap0 create
# ifconfig bridge0 create
# ifconfig bridge0 addm nfe0
# ifconfig bridge0 addm tap0
# ifconfig bridge0 inet 192.168.7.250 netmask 0xffffff00

# service openvpn start

Можно проверить запустился ли сервер:

# sockstat -4 -l | grep openvpn
nobody   openvpn    1316  4  udp4   *:1194                *:*

Если сервер OpenVPN не запустился, значит нужно смотреть логи и искать ошибку. Если все заработало, то можно приступить к настройке клиента.

С клиентом все проще, для его работы нужно сгенерировать сертификат и нарисовать конфиг. Также клиенту надо будет предоставить ранее сгенерированный корневой сертификат. Генерируем сертификат для клиента:

# pwd
/usr/local/etc/openvpn/easy-rsa

# sh
# . ./vars
# ./build-key client
Generating a 1024 bit RSA private key
.....................................++++++
.........++++++
writing new private key to 'client.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [Russia]:
Locality Name (eg, city) [Yekaterinburg]:
Organization Name (eg, company) [www.example.org]:
Organizational Unit Name (eg, section) [none]:
Common Name (eg, your name or your server's hostname) [client]:
Name [Nekit]:
Email Address [nekit@info-x.org]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/local/etc/openvpn/test/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'Russia'
localityName          :PRINTABLE:'Yekaterinburg'
organizationName      :PRINTABLE:'www.example.org'
organizationalUnitName:PRINTABLE:'none'
commonName            :PRINTABLE:'client'
name                  :PRINTABLE:'Nekit'
emailAddress          :IA5STRING:'nekit@info-x.org'
Certificate is to be certified until Jan 14 06:13:31 2040 GMT (9999 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Теперь можно установить клиент OpenVPN. Я буду устанавливать и настраивать его на винде. Скачать дистрибутив OpenVPN для Windows можно отсюда. По оканчании установки идем в папку куда был установлен OpenVPN и создаем в ней подпапку config. В папке config должны находиться следующие файлы:

  • Корневой сертификат
  • Клиентский сертификат и ключ
  • Ключ, созданный для дополнительной защиты (его можно и не использовать, но если сервер его использует, то и клиент должен)

Также там должен быть конфигурационный файл (с расширением *.ovpn), содержание которого имеет такой вид:

client

# Адрес сервера
remote vpn.example.org 1194

# Использовать TCP или UDP?
proto udp

# Проверить доступность сервера. Данная опция может быть полезна
# людям, которые выходят в интернет через соединения, которые
# часто обрываются.
resolv-retry infinite

nobind

dev tap
;dev tun

ca ca.crt
cert client.crt
key client.key

keepalive 10 120
tls-auth ta.key 1
cipher BF-CBC        # Blowfish (default)
comp-lzo
persist-key
persist-tun

Когда все приготовления закончены, тогда можно запускать OpenVPN и подключаться к серверу. Если что-то идет не так, то читаем логи и ищем ошибки. Также, за помощью можно обратиться в форум. 

Гость (не проверено)

А нет ли случаем статьи про DoubleVPN на FreeBSD? С маршрутами дико запарился. 

Гость (не проверено)

А нет ли случаем статьи про DoubleVPN на FreeBSD? С маршрутами дико запарился.

А почему тогда не рассмотреть вариант с динамической маршрутизацией?

Гость (не проверено)

Спасибо за пост. Еще интересует настройка мобильных клиентов, типа как здесь - http://sysadm.pp.ua/linux/shifrovanie/openvpn-client-server.html . Посоветуйте, пожалуйста, хорошый и удобный мобильный OpenVPN клиент ?

papadok75 (не проверено)

Сделал по вашей статье, но клиенты не получают IP-адрес от моего сервера :(

nekit
Сделал по вашей статье, но клиенты не получают IP-адрес от моего сервера :(
А у вас DHCPсервер установлен и настроен? По статье выдача IP адресов осуществляется не OpenVPN а сторонним DHCP сервером.
papadok75 (не проверено)

DHCP-сервер настроен на другой машине (DC), адреса раздаёт не openvpn. Клиенты соединяются с OpenVPN-сервером, но адрес не получают :(

То есть интерфейс tap появляется! Попробуйте назначить IP вручную через ifconfig, посмотреть ходят ли пакеты через ping или tcpdump. Если пакеты ходят, то проблема в видимости DHCP сервера.
papadok75 (не проверено)

Интерфейс tap есть, IP вручную устанавливал, клиент устанавливает соединение, это видно в логах и клиента и сервера, но адрес не получает, постоянно крутится "Идентификация..." на подключении клиента. На сервере уровень логирования 6 и ни одной ошибки.

papadok75 (не проверено)

В том то и дело что нет пинга, адрес не получают и пинговать нечего...

papadok75 (не проверено)

Устанавливал адреса и на сервере и на клиенте, но пинги так и не пошли

nekit
Тогда покажите вывод ifconfig (ipconfig) на сервере и на клиенте после соединение OpenVPN с установленными вами вручную Ip адресами, логи соединение клинета/сервера (лучше на пастебин или др.). Сразу вопросы: фаервол на клиенте/сервере есть (может он блочит траффик через неизвестные ему интерфейсы), нужен вывод tcpdump на интерфейсе tap, лучше со стороны сервера.
papadok75 (не проверено)

Логи объемные, есть возможность приложить архив к сообщению?

Добавить комментарий

CAPTCHA
RFC 5321
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Яндекс.Метрика