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

Июль, 08th 2009Рубрика: *NIX 17150
Подписаться на комментарии по 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"

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

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

  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

comments powered by HyperComments
Без регистрации
ваш комментарий будет опубликован после проверки
Регистрация на сайте

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