Настройка VPN-сообщества под FreeBSD и OpenVPN

27 Sep 2015 | Автор: dd |

Возникла тут необходимость дать видеоинженерам клиента удаленный доступ в локалку. Видеоинженеры же народ ленивый- хочет монтировать передачи и ролики, не отрывая задницу от домашнего дивана, так что этим они несколько похожи на одминов. Поскольку клиент оказался нераскручивываем на приобретение CheckPoint UTM-1, а фаервол я ему уже как то поднимал под FreeBSD, то пришлось мутиться с настройкой VPN сервера под фряхой 8.2. Хотя я и хотел поставить Untangle, про который уже как то рассказывал, но по итогам решил, что проще будет поднять все на одной машине, но под управлением хорошо зарекомендовавшего себя пакета OpenVPN, который помимо того что поддерживает все вариации подключений, так еще и идет со своим клиентом. Поднимать все это богатство я решил на сертификатах открытых ключей Х.509 под управлением RSA Key Management. Лить воду на жернов копирайта по поводу выбора сертификации мне неохота, так как меня от этой темы трясет еще с экзаменов CCSA, так что сразу перейду к настройке решения. Ставить будем на нашу любимскую FreeBSD, предварительно заточив её по всем правилам науки.

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

в логе инсталяшки видим напоминалку о том, что надо бы врубить работу пакета в /etc/rc.conf, синтаксис которого описан в файле /usr/local/etc/rc.d/openvpn. В этой связи добавляем в /etc/rc.conf следующие строки:
openvpn_enable=”YES”
openvpn_if=”tun”              # driver(s) to load, set to “tun”, “tap” or “tun tap”
openvpn_configfile=”/usr/local/etc/openvpn/openvpn.conf”
openvpn_dir=”/usr/local/etc/openvpn”

Поскольку указанных директорий и файлов у нас нет, то создаем их:
# mkdir /usr/local/etc/openvpn
# touch /usr/local/etc/openvpn/openvpn.conf

а также всю внутреннюю структуру папки /usr/local/etc/openvpn
# mkdir /usr/local/etc/openvpn/ccd
# mkdir /usr/local/etc/openvpn/keys

Надо отметить, что в работе openvpn использует openssl и его структуру, так что если мы планируем еще тщательнее защищаться, то нам надо весь фарш из папки /etc/ssl переносить в нашу папку /usr/local/etc/openvpn/ , включая как папки certs, crl, serial, private, так и  базы данных сертификатов serial и index.txt. Поскольку я бился на удаленной системе посредством ssh, а переться в офис мне совсем не хотелось, то я оставил все на месте, минимизировав перенастройку openssl.

После этого переходим к созданию сертификатов RSA, для чего следуем в папку /usr/local/share/doc/openvpn/easy-rsa/2.0 где редактируем файл /usr/local/share/doc/openvpn/easy-rsa/2.0/vars где прописываем свои настройки, чтобы этого не делать при создании сертификатов:
export KEY_COUNTRY=”RU”
export KEY_PROVINCE=”RF”
export KEY_CITY=”Moscow”
export KEY_ORG=”Peredelka”
export KEY_EMAIL=”admin@odminblog.ru”
export KEY_CN=vpn-server
export KEY_NAME=odmin_root
export KEY_OU=Adminz

После этого надо дать права на исполнение для некоторых файлов:
# chmod +x whichopensslcnf vars clean-all build-ca pkitool build-key-server build-key build-dh
после чего можно инициировать создание файлов ключей (если вы используете bash, то первую команду можно опустить):
# sh
# . vars
# ./clean-all
# ./build-ca

где собственно в диалоге уже будут прописаны наши данные, так что стоит ограничиваться только нажатием энтера.
Теперь создаем сертификат X.509 для нашего сервера, который мы указали в KEY_CN=vpn-server, при этом нам будет предложено задать пароль для обмена ключами, а также надо отметить, что переменную An optional company name [] следует задавать той же что и была указана для создания корневого сертификата Organization Name (eg, company). После этого подписываем наш сертификат своими силами.
# ./build-key-server vpn-server
Создаем сертификат X.509 для клиентской части, при этом имя клиента KEY_CN мы указываем отличным от имени сервера, например vpn-client.
# ./build-key vpn-client
Теперь генерим ключи Диффи-Холмана, которые будут использоваться при хендшейках и обмене ключами:
# ./build-dh
генерация займет некоторое время, но она идет на автомате. На последок создаем файл для TLS аутентификации:
# openvpn –genkey –secret keys/ta.key
после чего в папке keys смотрим полученные ключики, которые соотносятся следующим образом.

Ключи сервера:
ca.crt , vpn-server.crt , vpn-server.key, dh1024.pem, ta.key
Ключи клиентской части:
ca.crt , vpn-client.crt , vpn-client.key, ta.key
Серверные ключики копируем из папки создания в папку openvpn, созданную нами первоначально  /usr/local/etc/openvpn/keys, после чего переходим к редактированию файла конфигурации /usr/local/etc/openvpn/openvpn.conf
### openvpn.conf  ###
dev tun0
port 5656
proto udp
ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/vpn-server.crt
key /usr/local/etc/openvpn/keys/vpn-server.key
dh /usr/local/etc/openvpn/keys/dh1024.pem
tls-auth /usr/local/etc/openvpn/keys/ta.key 0
client-config-dir ccd
# задаем подсеть сервера VPN
server 172.16.0.0 255.255.255.0
# Прописываем маршрутизацию на внутреннюю сетку (у меня 192.168.0.0)
push “route 192.168.0.0 255.255.255.0″
# Маршрутизация для клиента
route 172.16.0.0 255.255.255.252
tls-server
tls-timeout 120
comp-lzo
auth MD5
cipher BF-CBC
keepalive 10 120
max-clients 100
user nobody
group nobody
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3
#########

Создаем файл c именем клиентского хоста, заданным при генерации сертификата:
# echo “ifconfig-push 172.16.0.2 172.16.0.1″ > /usr/local/etc/openvpn/ccd/vpn-client
при этом у нас получается подсеть для клиента с маской 255.255.255.252 которую мы указывали в файле настроек, так что в нашем случае это будет туннель с клиентской частью 172.16.0.2, серверной частью 172.16.0.1, широковещательным адресом 172.16.0.3 и адресом сетки 172.168.0.0, так что последующих клиентов эта запись будет иметь вид (в файлах для их имён и сертификатов):
ifconfig-push 172.16.0.6 172.16.0.5
ifconfig-push 172.16.0.10 172.16.0.9
ifconfig-push 172.16.0.14 172.16.0.13
если кто не понял то адресация IP идет +4

также создаем файлы журналирования:
# mkdir /var/log/openvpn
# touch /var/log/openvpn/openvpn-status.log
# touch /var/log/openvpn/openvpn.log

Открываем на нашем фаерволе входящий трафик на порт udp/5656 для того чтобы внешние клиенты могли подрубаться к нашему VPN серверу, а также разрешить прохождение трафика через интефрейс OpenVPN и внутресетвой трафик.

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

Вроде как теперь все должно работать, так что для того чтобы все запустилось- перезапускаем сервер, и настраиваем клиента на локальной машине.
На локальной машине, ставим пакет OpenVPN, который можно взять с офф.сайта. После этого сливаем клиентские файлы: ca.crt , vpn-client.crt , vpn-client.key, ta.key в папочку C:\Program Files\OpenVPN\config (или той куда ставили клиента) и создаем в ней файл клиентских настроек openvpn.ovpn, в который прописываем следующие параметры:
#### openvpn.ovpn ###
dev tun0
proto udp
# внешний IP VPN-сервера
remote X.X.X.X
# порт подключения
port 5656
client
resolv-retry infinite
ca ca.crt
cert vpn-client.crt
key vpn-client.key
tls-client
tls-auth ta.key 1
auth MD5
cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun
verb 3
#########

После этого запускаем клиента и он автоматом ломится на наш сервак и устанавливает сессию.

Собственно на этом можно было бы закочить, если бы в сети не жили беспокойные парни, которым обязом надо поставить себе Windows 7, да еще и x64. Для запуска OpenVPN под Windows 7 следует ставить версию openvpn-2.1_rc19 (или какую нить другую от _rc15). Выкачиваем её и щелкаем правой кнопкой на инсталлер: Свойства -> Совместимость -> Запустить пакет в режиме Windows Vista , а также выставить галку “Выполнять эту программу от имени администратора“. После этого можно запускать инсталлер, который встанет без проблем, после чего на значке OpenVPN GUI надо будет также выставить, что запускать его следует от админа.

Для особо беспокойных, живущих в режиме параноик-мод, файлы ключиков, можно записать например на шифрованный диск или внешний носитель, и запускать клиент только после того как диск будет подмонтирован, тогда в openvpn.ovpn , пути настроек будут выглядеть следующим образом (сертификаты расположены в папке keys):
ca  “X:\\keys\\ca.crt”
cert “X:\\keys\\vpn-client.crt”
key “X:\\keys\\vpn-client.key”
tls-auth “X:\\keys\\ta.key” 1

При установке клиента под Линух, файл конфигурации клиента openvpn.conf должен лежать в папке /usr/local/etc/openvpn , местоположение ключиков задаем естественно из него.

На тему настройки клиента под Mac я видимо отпишусь позже, так как мне это поставили на вид, но настраивать я не стал, так как макаки у меня под рукой нет, а убивать полдня на поиск имиджа по виртуалку меня заломало. Так что как только мне выдадут подопытную обезьяну, то отпишусь по результатам.

Дата последнего редактирования: 27.06.2011

VN:F [1.9.21_1169]
Rating: 3.4/10 (96 votes cast)
VN:F [1.9.21_1169]
Rating: +3 (from 15 votes)
Настройка VPN-сообщества под FreeBSD и OpenVPN, 3.4 out of 10 based on 96 ratings

Теги: , , , ,

Отзывов: 4 на «Настройка VPN-сообщества под FreeBSD и OpenVPN»

  1. Автор: Виктор на 14 Jul 2012

    Доброй ночи.
    Хочу задать вопрос. Никак не могу пробиться во внутреннюю сеть.
    Соединение поднимается, интерфейс сервера пингуется, но ни один внутренний хост не отзывается.
    Подскажите куда копать, уже всю сеть излазил. конифигов 20 попробовал.
    Спасибо!

    [Reply]

    anchous Reply:

    видимо копать в сторону фаервола или маршрутизации приватных каналов

    [Reply]

    VN:F [1.9.21_1169]
    Rating: 1.5/5 (2 votes cast)
    VN:F [1.9.21_1169]
    Rating: 0 (from 0 votes)
  2. Автор: Alex на 12 Dec 2017

    Интересует связка OpenVPN под FreeBSD и клиент на IPhone или Windows-Phone (есть у нас в фирме такие товарищи))). Если со стороны FreeBSD более менее понятно, то с настройкой IPhone – темный лес. Как из FreeBSD взять профиль для IPhona?
    P.S. Настроил бы PPTP, да эти указанные товарищи это не поддерживают(

    [Reply]

    anchous Reply:

    ну а причем тут именно фря? почитайте об ограничениях айфоновского клиента и исходя из этого подкрутите сервер и создайте соответствующий профиль для VPN клиента

    [Reply]

    VN:F [1.9.21_1169]
    Rating: 1.7/5 (3 votes cast)
    VN:F [1.9.21_1169]
    Rating: 0 (from 0 votes)

Ваш отзыв