Настройка OpenVPN сервера в режиме моста на FreeBSD 6.x и FreeBSD 7.x

Июль, 08th 2009Рубрика: *NIX 21321
Подписаться на комментарии по RSS

Имеем задачу - организовать безопасный доступ из внешнего мира к внутренней корпоративной сети. Данная статья не претендует на исчерпывающее повествование по данной теме. В ней не раскрываются все возможности и опции настройки OpenVPN - это пример из личной практики, где я берусь описать процесс создания OpenVPN сервера на системе FreeBSD, с возможностью подключения к нему удаленных пользователей (с различных операционных систем: Windows, Linux, MacOS etc.).

За более подробной информацией рекомендуется обратится на сайты разработчиков openvpn.net, www.openvpn.se и man-страницы.

Для начала установим сам OpenVPN из портов:

cd /usr/ports/security/openvpn
make install

Во время установки будет предложено включить PW_SAVE? Данная опция дает возможность чтения текущих паролей из файла. Хотите включайте - хотите нет (сам эту опцию не включаю). Это не самый критичный параметр :)

Далее нужно создать директорию, где будут храниться настройки OpenVPN сервера и скопировать туда пакет управления ключами RSA, а также каталог для хранения ключей:

mkdir -p /usr/local/etc/openvpn
cp -r /usr/local/share/doc/openvpn/easy-rsa /usr/local/etc/openvpn
mkdir -p /usr/local/etc/openvpn/keys

В директории /usr/local/share/doc/openvpn/easy-rsa с исполняемых файлов снят бит выполнения, поэтому можно их скопировать из директории /usr/ports/security/openvpn/work/openxpn-x.y.z/easy-rsa/ либо установить вручную.

Теперь приступаем к созданию файлов настроек для сервера и клиентов. За основу возьмём примеры файлов настроек, расположенные в /usr/local/share/doc/openvpn/sample-config-files. Так как мы делаем сервер, то нам интересен файл server.conf.

vi /usr/local/etc/openvpn/server.conf
#Какой IP слушает сервер OpenVPN (необязательно)
;local 1.2.3.4
#какой TCP/UDP порт слушает сервер. Для использования нескольких отдельных серверов OpenVPN, необходимо указать разные порты.
port 1194
#Какой протокол будет использовать сервер TCP или UDP
proto udp
#указание типа интерфейса и режима работы
#tun = L3-туннель, tap = L2-туннель
dev tap
#главный SSL/TLS сертификат (ca)
#сертификат (cert), частный ключ (key).
#каждый клиент и сервер имеет собственные пары сертификата и ключа.
#Сервер и все его клиенты должны иметь один (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
#Пример настройки сервера в режиме сетевого моста:
#адрес сервера внутри сети и маска 192.168.1.1 255.255.255.0
#диапазон выдаваемых ip для клиентов (192.168.1.200-192.168.1.210)
server-bridge 192.168.1.1 255.255.255.0 192.168.1.200 192.168.1.210
#указываем где хранятся файлы с настройками клиентов если нужны особые настройки
;client-config-dir ccd
#Время жизни неактивной сессии. Пинговать каждые 10 сек. Считать что соединение разорвано если нет пинга в течении 120 сек.
keepalive 10 120
#Метод криптографического шифрования. Аналогичная настройка должна содержаться в конфиге клиента
cipher BF-CBC        # Blowfish (default)
;cipher AES-128-CBC   # AES
;cipher DES-EDE3-CBC  # Triple-DES
#использовать сжатие на vpn соединении (аналогично и в конфиге клиента)
comp-lzo
#снизить права демона OpenVPN
;user nobody
;group nobody
#Использовать те же интерфейс и ключ при рестарте сервера
persist-key
persist-tun
#Файл статуса, в который пишутся текущие соединения, обновляется и переписывается каждую минуту
status openvpn-status.log
#указываем файл, где фиксируется информация об отозваных сертификатах
crl-verify /usr/local/etc/openvpn/keys/crl.pem
#по умолчанию сообщения лога передаются syslog'у.
#"log" - перезаписывает лог файл после каждого запуска
#"log-append" добавляет данные в конец лога
#Можно использовать только один из вариантов
;log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
#Уровень детализации лога
#0 только фатальные ошибки
#1-4 рабочий режим
#5-6 для отладки сервера
#9 самая полная детализация
verb 3
;mute 20

Файл client.conf по сути является зеркалом server.conf, за исключением некоторых специфичных функций.

client # показываем что это именно клиентский конфиг
dev tap # тут должно стоять
proto udp # то-же что и в серверном конфиге
remote xxx.xxx.xxx.xxx 1194 #адрес удаленного сервера
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt # прописываем пути
cert vpnuser1.crt # к локальным копиям
key vpnuser1.key # ключей и сетификатов
;cipher x
comp-lzo
verb 3
;mute 20

Теперь перейдем к настройке самой FreeBSD для работы в качестве VPN сервера. Здесь будут некорые различия для 6 и 7 версии. Рассмотрим их подробнее:

---FreeBSD 6---

1. собрать ядро с опциями

options BRIDGE
options IPSEC
options IPSEC_ESP
# Pseudo devices.
device  tap

2. в /etc/sysctl.conf прописать поднятие виртуального tap интерфейса

net.link.ether.bridge.enable=1
net.link.ether.bridge.config=re0,tap0
// в данном примере re0 - сетевой интерфейс смотрящий в локалку

3. в /etc/rc.conf прописать

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

---FreeBSD 7---

1. собрать ядро с опциями

options IPSEC
device  crypto
device  if_bridge
# Pseudo devices.
device  tap

в примере vr0 - сетевой интерфейс смотрящий в локалку

2. в /etc/rc.conf прописать

cloned_interfaces="tap0 bridge0"
ifconfig_bridge0="addm vr0 addm tap0 up"
openvpn_enable="YES"
openvpn_if="tap bridge"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"

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

. ./vars

на всякий случай, удаляем существующие ключи командой:

./clean-all

Генерируем корневой сертификат:

./build-ca

В процессе выполнения последнего скрипта вам будет задано несколько вопросов. Нужно ввести только Common Name для сертификата (например, RootCA), все остальные параметры уже заданы в качестве переменных окружения скриптом vars.

После создания корневого сертификата необходимо сгенерировать для сервера секретный ключ. В этом вам поможет скрипт buildkey-server. Как и в предыдущем случае, для большинства вопросов можно оставить ответы по умолчанию. На вопрос о Common Name введите “server”, на два последних вопроса (подписать ли сертификат и – каламбур, но перевод именно такой – сертифицировать ли его) ответьте утвердительно; когда вас спросят о пароле (“A challenge password”) – введите пароль для ключа сервера (запоминать его не нужно). Наберите:

./build-key-server server

Далее, создайте ключи для необходимого количества клиентов. Эта процедура аналогична созданию ключа для сервера, за исключением того, что для клиентов ключи создаются скриптом build-key, а не buildkey-server. У каждого ключа, конечно же, должно быть указано свое значение в поле Common Name:

./build-key clientname

Если вы хотите защитить паролем ключи клиентов, воспользуйтесь вместо build-key скриптом build-key-pass. Хочу заметить, что сам паролю ключи, если это нужно на стороне клиента. Это можно сделать с помощью GUI оболочки.

И наконец, в довершение ко всем сертификатам и ключам необходимо создать файл параметров Диффи [Diffie] и Хеллмэна [Hellman]. Алгоритм Диффи и Хеллмэна позволяет обмениваться секретными ключами по небезопасным каналам. Для их генерации запустите скрипт build-dh без параметров:

./build-dh

В следующей статье я подробно расскажу про установку и настройку GUI интерфейса openVPN на стороне клиента в ОС Windows.

FreeBSD 11

Никаких дополнительных модулей в ядро добавлять не нужно. Пример rc.conf (для автоматического поднятия интерфейса tap0 в /etc/rc.conf следует дописать последнюю строку):

cloned_interfaces="tap0 bridge0"
ifconfig_bridge0="addm vr0 addm tap0 up"
openvpn_enable="YES"
openvpn_if="tap bridge"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"
ifconfig_tap0="up"

Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.

Комментариев: 4

  1. 2009-10-19 в 10:22:32 | Максим Семин

    Я, хоть и не постоянный читатель, но всё же выскажу свое мнение. На ваш блог попал совсем случайно. Однако узнал много чего нового и интересного. Так что, как говорится, АФФТАР ПЕШИ ИСЧО! :)

  2. 2010-02-20 в 00:22:18 | Alex

    Спасибо за статью, помогла мне :)

    хочу добавить, что мне на FreeBSD 7.2p6 с openvpn в режиме bridge помогло:

    1) чтобы tap0 становился up после запуска openvpn: sysctl net.link.tap.up_on_open=1

    2) отключил firewall:

    sysctl net.link.bridge.pfil_member=0

    sysctl net.link.bridge.pfil_bridge=0

  3. 2011-08-06 в 02:30:17 | dre@mer]]>avatar]]>

    Совершенно верно. Автоматического поднятия интерфейса tap0 можно добиться, добавив в файл /etc/sysctl строку: net.link.tap.up_on_open=1

  4. 2017-12-18 в 16:18:41 | Alex

    Огромное спасибо за статью

    Выяснилось, что андроид не поддерживает tap. После переключения в tun подключение состоялось.

    Теперь подключается, но за сервером локальную сеть не видит. Может подскажете куда копать? Фаервол открыл, на маршрутизаторе маршрут добавил..

ваш комментарий будет опубликован после проверки
на указанный адрес будет отправлено письмо с кодом активации. Вы можете настроить собственный профиль и стать активным участником или автором.