Имеем: FreeBSD 6.2, инет - офис - сервер FreeBSD 6.2, инет - инет - филиал Надо: Прозрачно объеденить 2 сети за роутерами с фрёй для пользования сервисами в обоих сетях
В данной статье пошагово расписана настройка Openvpn-сервера (со статическими ключами и сертификатами) и клиента для маршрутизируемого, зашищённого объединения 2 сетей
Статья пишется с первой статьи, по памяти - было давно.....
Исходные данные: Свежеустановленая FreeBSD 6.2, в офисе rl0=22.22.22.22/30 - сетевая карта смотрящая к провайдеру (маска произвольная) rl1=192.168.2.1/24 - сетевая смотрящая внутрь локальной сети за FreeBSD 6.2
Свежеустановленая FreeBSD 6.2, в филиале rl0=11.11.11.11/30 - сетевая карта смотрящая к провайдеру (маска произвольная) rl1=192.168.1.1/24 - сетевая смотрящая внутрь локальной сети за FreeBSD 6.2
(всё необходимое для работы потянется из репозитария)
1. Устанавливаем и конфигурируем OpenVPN
наиболее простой и "правильный" метод - ставим всё из портов
Всё необходимое поставлено, переходим к конфигурированию СЕРВЕРА. Необходимо создать сертефикаты и ключи.Заходим в /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 - создаём файлы (пустой и с "нулевым" содержимым соответственно)
Создаем сертификат X.509 для сервера. Всё аналогично заполняем(точно так же) + cтроки в котрых указываем пароль и имя организации (!)
#./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
Создаем ключ Диффи Хельман(о нем можно почитать здесь:
Теперь выходим из 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 директории на сервере и 2 на клиенте /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) на сервере, клиенту же достаются ca.crt, dh1024.pem, client.crt, client.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.0255.255.255.0
#задаем МАРШРУТ который передаём клиентту
# и маску подсети для того чтобы он "видел"
# сеть за опенвпн сервером (сеть 192.168.1.0/24)
push route 192.168.2.0255.255.255.0
# указываем где хранятся файлы с
# настройками IP-адресов клиентов
client-config-dir ccd
# добавляем маршрут сервер-клиент
route 10.10.200.0255.255.255.252
этой строкой описываем маршруты к сетям к которым ходить через тунель!!!!!
в данном случае к сети в филиале)
route 192.168.1.0255.255.255.0
# включаем TLS аутификацию
tls-server
# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth keys/ta.key 0
# таймаут до реконекта
tls-timeout 120
auth MD5 #
# включаем шифрацию пакетов
cipher BF-CBC
keepalive 10120
# сжатие трафика
comp-lzo
# максимум клиентов
max-clients 100
user nobody
group nobody
# Не перечитывать ключи после получения
# SIGUSR1 или ping-restart
persist-key
# Не закрывать и переоткрывать TUN\TAP
# устройство, после получения
# 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 (имя файла - имя которому выдан сертификат) следующего содержания
Тут мы выдали клиенту с сертификатом client.crt вирт. айпи 10.200.200.2, шлюз 10.200.200.1 и задали маршрут через тунель к сети за клиентом Сервер готов для автостарта при загрузке Openvpn-сервера -внесём в /etc/rc.conf
openvpn_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.Настраиваем клиента Создадим конфигурационный файл client.conf в папке /usr/local/etc/openvpn/. И скопируем туда же все необходимые ключи для работы (ca.crt, dh1024.pem, client.crt, client.key, ta.key). Содержимое файла openvpn.ovpn
dev 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
up /usr/local/etc/openvpn_up.sh
#этой строкой указываем выполнять скрипт после запуска - там будет добавление маршрута
#к сети за сервером если его не создать - то по маршрутом по умолчанию станет вирт.
#айпи опенвн-сервера, в связи со строкой в конфиге сервера push route
verb 3
для автостарта при загрузке Openvpn-клиента -внесём в /etc/rc.conf
openvpn_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/client.conf" # --config file
openvpn_dir="/usr/local/etc/openvpn" # --cd directory