Настройка OpenVPN сервера в режиме моста на FreeBSD 6.x и FreeBSD 7.x
Имеем задачу - организовать безопасный доступ из внешнего мира к внутренней корпоративной сети. Данная статья не претендует на исчерпывающее повествование по данной теме. В ней не раскрываются все возможности и опции настройки 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
Я, хоть и не постоянный читатель, но всё же выскажу свое мнение. На ваш блог попал совсем случайно. Однако узнал много чего нового и интересного. Так что, как говорится, АФФТАР ПЕШИ ИСЧО! :)
Спасибо за статью, помогла мне :)
хочу добавить, что мне на 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
Совершенно верно. Автоматического поднятия интерфейса tap0 можно добиться, добавив в файл /etc/sysctl строку: net.link.tap.up_on_open=1
Огромное спасибо за статью
Выяснилось, что андроид не поддерживает tap. После переключения в tun подключение состоялось.
Теперь подключается, но за сервером локальную сеть не видит. Может подскажете куда копать? Фаервол открыл, на маршрутизаторе маршрут добавил..