Openvpn + FreeBSD

Имеем: FreeBSD 6.2, инет

Надо: ВПН-сервер для доступа из внешнего мира к корпоративной сети

В данной статье пошагово расписана настройка Openvpn-сервера (со статическими ключами и сертификатами) и Windows-клиента (Openvpn-gui)

Исходные данные:

Свежеустановленая FreeBSD 6.2,

rl0=22.22.22.22/30 - сетевая карта смотрящая к провайдеру (маска произвольная)

rl1=192.168.1.1/24 - сетевая смотрящая внутрь локальной сети за FreeBSD 6.2

(всё необходимое для работы потянется из репозитария)

1. Устанавливаем и конфигурируем OpenVPN

наиболее простой и "правильный" метод - ставим всё из портов #cd /usr/ports/security/openvpn

#make

#make install

Всё необходимое поставлено, переходим к конфигурированию. Необходимо создать сертификаты и ключи. Заходим в /usr/local/share/doc/openvpn/easy-rsa/ и изменяем файл vars.Лично я оставил все параметры дефолтовыми, кроме директории куда складывать сгенерированное "добро" - изменил в этом файле строку export KEY_DIR=$D/keys на export KEY_DIR=$D/keys/server, соответственно создав такую же дирректорию /usr/local/share/doc openvpn/easy-rsa/keys/server. Собственно создаём "ДОБРО" - сертификаты и ключи# cd /usr/local/share/doc/openvpn/easy-rsa/

# (в этом файлике изменяете путь к ключам)

#ee ./vars

# меняем строку KEY_DIR=$D/keys на KEY_DIR=$D/keys/server

Внимание! Если у вас по умолчанию не баш, то перед следующими операциями нужно набрать в консоли "sh", советую для "100-%-ного" результата всё же наверняка сделайте это, даже если у вас шелл sh. Загружаем переменные в оболочку:

#sh

#. ./vars

Очищаем от старых сертификатов и ключей папку keys/server и создаем серийный и индексные файлы для новых ключей#./clean-all

Создаём сертификат. При создании сертификата вводим необходимую инф-цию (настоятельно рекомендую делать как тут, а потом уже разбираться что к чему - большинство проблем(!) связанно именно с именами при конфигурировании на первом этапе)

Привожу листинг с консоли#./build-ca (Создаем Certificate Authority для сервера)

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) [UA]:UA

#Провинция

State or Province Name (full name) [Kiev]:Kiev

#Город

Locality Name (eg, city) [Kiev]:Kiev

#Название компании(!)

Organization Name (eg, company) [x]:server

#Отделение компании

Organizational Unit Name (eg, section) []:server

#ВОТ ТУТ ВНИМАТЕЛЬНО - ЭТО ИМЯ МАШИНЫ ДЛЯ КОТОРОЙ

# ГЕНЕРИРУЕМ СЕРТИФИКАТ (имя не в полном смысле

# -имя как идентификатор)

Common Name (eg, your name or your server's hostname) []:server

#Почт адрес

Email Address [root@localhost]:

Не факт что у всех, но встречал подобное: при попытке создать сертификат - была ругня на отсутствующие файлы index.txt и serial. В /usr/local/share/doc/openvpn/easy-rsa/keys/server - создаём файлы (пустой и с "нулевым" содержимым соответственно)

#echo "">/usr/local/share/doc/openvpn/easy-rsa/keys/server/index.txt

#echo "00">/usr/local/share/doc/openvpn/easy-rsa/keys/server/serial

Создаем сертификат X.509 для сервера. Всё аналогично заполняем(точно так же) + строки в которых указываем пароль и имя организации (!)#./build-key-server server

# Страна

Country Name (2 letter code) [UA]:UA

# Провинция

State or Province Name (full name) [Kiev]:Kiev

# Город

Locality Name (eg, city) [Kiev]:Kiev

# Название компании(!)

Organization Name (eg, company) [x]:server

# Отделение компании

Organizational Unit Name (eg, section) []:server

# ВОТ ТУТ ВНИМАТЕЛЬНО - ЭТО ИМЯ МАШИНЫ

Common Name (eg, your name or your server's hostname) []:server

# Почт адрес

Email Address [root@localhost]:

Please enter the following 'extra' attributes

to be sent with your certificate request

# пароль

A challenge password []:123456789

# название организации

# (как и в создании корневого сертификата)

An optional company name []:server

в конце соглашаемся и подписываем сертификат, отвечая "yes" :-)

Создаём ключ для клиента#./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) [UA]:UA

State or Province Name (full name) [Kiev]:Kiev

Locality Name (eg, city) [Kiev]:Kiev

Organization Name (eg, company) [server]:server

Organizational Unit Name (eg, section) []:server

Common Name (eg, your name or your server's hostname) []:client

Email Address [root@localhost]:

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:123456789

An optional company name []:client

Будьте внимательны при заполнении данных сертификатов, поле Common Name обязательно к заполнению, причем для сервера оно должно быть одно, а для клиента другое. Например в поле Common Name при генерации сертификата X.509 для сервера можно написать server, а для клиента соотвественно client

Создаем ключ Диффи Хельман(о нем можно почитать здесь: http://www.rsasecurity.com/rsalabs/node.asp?id=2248)# ./build-dh

Теперь выходим из sh написав команду "exit". И в конце создаем ключ для tls-аутификации# openvpn --genkey --secret keys/server/ta.key

После всех этих манипуляций в папке keys/server получается много файлов:

ca.crt - Главный CA сертификат, этот файл нужен и клиенту и серверу

dh1024.pem - ключ Диффи Хельман, этот файл нужен только серверу

server.crt - Сертификат сервера, нужен только серверу

server.key - Ключ сервера, нужен только серверу (СЕКРЕТНЫЙ файл)

client.crt - Сертификат клиента, нужен только клиенту

client.key - Ключ клиента, нужен только клиенту (СЕКРЕТНЫЙ файл)

ta.key - TLS-ключ, нужен и клиенту и серверу

Следовательно серверу достаются файлы ca.crt, dh1024.pem, server.crt, server.key, ta.key, а клиенту ca.crt, dh1024.pem,client.crt, client.key, ta.key

Самое сложное позади smile.gif

2.Настраиваем сервер

Создаём 3 директории

/usr/local/etc/openvpn

/usr/local/etc/openvpn/keys

/usr/local/etc/openvpn/ccd

Так же для удобства скопируем все ключи в /usr/local/etc/openvpn/keys (ca.crt, dh1024.pem, server.crt, server.key, ta.key).

Создаем конфигурационный файл server.conf следующего содержимого:

#порт на котором работает сервер

port 2000

# протокол - советую udp

proto udp

# - используемый тип устройства и номер

dev tun0

#указываем файл 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

#задаем IP-адрес сервера и маску подсети

# (виртуальной сети) - можно произвольную, (я выбрал такую)

server 10.10.200.0 255.255.255.0

#задаем МАРШРУТ который передаём клиентту

# и маску подсети для того чтобы он "видел"

# сеть за опенвпн сервером (сеть 192.168.1.0/24)

push "route 192.168.1.0 255.255.255.0"

# указываем где хранятся файлы с

# настройками IP-адресов клиентов

client-config-dir ccd

# добавляем маршрут сервер-клиент

route 10.10.200.0 255.255.255.252

# включаем TLS аутентификацию

tls-server

# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента

tls-auth keys/ta.key 0

# таймаут до реконекта

tls-timeout 120

auth MD5 #

# включаем шифрацию пакетов

cipher BF-CBC

keepalive 10 120

# сжатие трафика

comp-lzo

# максимум клиентов

max-clients 100

user nobody

group nobody

# Не перечитывать ключи после получения

# SIGUSR1 или ping-restart

persist-key

# Не закрывать и переоткрывать TUNTAP

# устройство, после получения

# SIGUSR1 или ping-restart

persist-tun

# логирование (не забудьте создать эту директорию /var/log/openvpn/)

status /var/log/openvpn/openvpn-status.log

log /var/log/openvpn/openvpn.log

# Уровень информации для отладки

verb 3

В дирректории /usr/local/etc/openvpn/ccd создаем файл client (имя файла - имя которому выдан сертификат) следующего содержания#echo "ifconfig-push 10.10.200.2 10.10.200.1" >

? /usr/local/etc/openvpn/ccd/client

Сервер готов

для автостарта при загрузке Openvpn-сервера -внесём в /etc/rc.confopenvpn_enable="YES" # YES or NO

openvpn_if="tun" # driver(s) to load, set to "tun", "tap" or "tun tap"

openvpn_configfile="/usr/local/etc/openvpn/server.conf" # --config file

openvpn_dir="/usr/local/etc/openvpn" # --cd directory

3.Настраиваем клиента под Windows

качаем клиента для виндозы отсюда http://openvpn.se/files/install_packages/ или из другого места. Создадим конфигурационный файл openvpn.ovpn в папке config (Например C:Program FilesOpenVPNconfig). И скопируем туда же все необходимые ключи для работы (ca.crt, dh1024.pem, client.crt, client.key, ta.key).

Содержимое файла openvpn.ovpndev tun

proto udp

remote 22.22.22.22#(реальный айпи вашего сервера)

port 2000 #(порт к которому устанавливать соединение

client

resolv-retry infinite

ca ca.crt

cert client.crt

key 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

вот и всё - конфиг взят с рабочего сервера + положен человеку у которого всё работет viewtopic.php?f=8&t=5708&start=0&st=0&sk=t&sd=a

НЬЮАНС!

В /usr/local/etc/openvpn/ccd при создании файла с настройками для клиента помните:

ifconfig-push 10.10.200.2 10.10.200.1

этой строкой организуем езернет-тун с сеткой 10.10.200.0, 2-мя тачками с айпишнеками 10.10.200.2 и 10.10.200.1 и бродкастом 10.10.200.3

соответственно при создании 2-го, 3-го и т.д. клиента - строка должна принимать вид

ifconfig-push 10.10.200.6 10.10.200.5

ifconfig-push 10.10.200.10 10.10.200.9

и т.д

4.Удаление недействительных сертификатов

Такая задача может возникнуть, если например, один из сотрудников работал через VPN, а потом уволился. Естественно, что ключи остались. Как обеспечить невозможность подключится с этим сертификатом: cd /usr/local/share/doc/easy-rsa/

sh

. ./vars

./revoke-full client1 # для каждого удаляемого клиента проделываем такую операцию

eсли будет выдавать ошибку error on line 282 of config file '....openvpn/easy-rsa/openssl.cnf', то комментируем следующие строки в openssl.cnf:#[ pkcs11_section ]

#engine_id = pkcs11

#dynamic_path = /usr/lib/engines/engine_pkcs11.so

#MODULE_PATH = $ENV::PKCS11_MODULE_PATH

#PIN = $ENV::PKCS11_PIN

#init = 0

и опять выполняем пункт 1.

Если всё хорошо, то должна появится такая строка"Revoking Certificate ... Data Base Updated"

Копируем только что создавшийся crl.pem на место того, который уже есть (путь к нему нужно смотреть в файле openvpn.conf, параметр crl-verify) Если такого параметра нет - то добавляем его и указываем местоположение нового файлаcrl-verify /usr/local/etc/openvpn/crl.pem

После этого ОБЯЗАТЕЛЬНО ВЫСТАВЛЯЕМ ПРАВА ДЛЯ ФАЙЛА crl.pem 644, иначе работать не будет. openvpn не сможет прочесть этот файл (у меня openvpn работает от юзера nobody).

Делаем рестарт демона:/usr/local/etc/rc.d/openvpn restart

Теперь не смогут подключится те, кого мы удалили из базы.

Если допустил ошибки - не просите Лиса подправлять

Обновлено: 12.03.2015