авто

Установка и настройка Openvpn на FreeBSD 9.1

 

instal-config-openvpn-on-freebsd-91


1. Инсталляция openvpn.
Приступаем к установке openvpn на ОС FreeBSD 9.1. ищем место нахождения порта openvpn  с, которого будем производить установку:

root@webserver:/usr/local/etc/openvpn # whereis openvpn
openvpn: /usr/ports/security/openvpn

Заходим в папку и начинаем стандартный процесс установки:

root@webserver:/usr/local/etc/openvpn # cd  openvpn: /usr/ports/security/openvpn
root@webserver:/usr/local/etc/openvpn # make
root@webserver:/usr/local/etc/openvpn # make install
После завершения установки добавляем строки в rc.conf:

#OpenVPN
openvpn_enable="YES"
openvpn_if="tap"
openvpn_configfile="/usr/local/etc/openvpn/openvpn.conf"
openvpn_dir="/usr/local/etc/openvpn"

2. Создание ключей и сертификатов.
Для начала нам необходимо проверить наличия папки «easy-rsa» по пути: «/usr/local/share/doc/openvpn/easy-rsa/». Если такой папки там нет, то мы просто копируем ее из пакета портов откуда ставился openvpn:

root@webserver:  cp /usr/ports/security/openvpn/work/ /usr/local/share/doc/openvpn/easy-rsa/

Далее собственно и приступаем к генерации сертификатов и ключей:

root@webserver: cd /usr/local/share/doc/openvpn/easy-rsa/

В этом файлике изменяете путь к ключам
root@webserver: joe ./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 для сервера. Всё аналогично заполняем(точно так же) + 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

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

# ./build-dh

После всех этих манипуляций в папке keys/server получается много файлов:
•  ca.crt - Главный CA сертификат, этот файл нужен и клиенту и серверу
•  dh1024.pem - ключ Диффи Хельман, этот файл нужен только серверу
•  server.crt - Сертификат сервера, нужен только серверу
•  server.key - Ключ сервера, нужен только серверу (СЕКРЕТНЫЙ файл)
•  client.crt - Сертификат клиента, нужен только клиенту
•  client.key - Ключ клиента, нужен только клиенту (СЕКРЕТНЫЙ файл)

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

3. Конфигурирование opevpn.
Создаем папку openvpn в  «/usr/local/etc» и в этой папке создаем следующие файлы и папки с правами доступа:

drwxr-xr-x   2 nobody  nobody     512 Feb 27 19:37 ccd
-rw-r--r--   1 nobody  wheel      273 Mar  1 10:29 ipp.txt
drwxr-xr-x   2 root    wheel      512 Feb  8  2012 keys
-rw-------   1 root    wheel      606 Feb 27 19:37 openvpn.conf
-rwxrwxrwx   1 root    wheel   101050 Mar  1 09:43 openvpn.log


Копируем сгенерированные сертификаты в папку с конфигурационными файлами:


#cp /usr/local/share/doc/openvpn/easy-rsa/ keys/server/*   /usr/local/etc/openvpn/key/

Теперь переходим к описанию правил конфигурации нашего сервера в файле openvpn.connf (приведённая конфигурация абсолютно рабочая, так как взята с действующего сервера):

cd /usr/local/etc/openvpn
local (вместо скобок прописываем внешний IP вашего сервера)
port 1194
proto udp
dev tap
ca keys/ca.crt
cert keys/server.crt
key keys/server.key  # This file should be kept secret
dh keys/dh1024.pem
server 172.16.10.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.0.0 255.255.255.0"
keepalive 10 120
comp-lzo
max-clients 8
user nobody
group nobody
persist-key
persist-tun
log         openvpn.log
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 4
#mute 20
client-config-dir ccd
ccd-exclusive
daemon

Сохраняем файл и далее прописываем пользователей и их ip адреса в файле ipp.txt:

client1,172.16.10.2
client2,172.16.10.3
client3,172.16.10.4


Сохраняем файл и переходим в папку ccd:

root@webserver:/usr/local/etc/openvpn/ # cd ccd/

и добавляем в нее файлы наших клиентов и меняем на них права доступа:

root@webserver:/usr/local/etc/openvpn/ccd # touch client1
root@webserver:/usr/local/etc/openvpn/ccd # chown nobody:nobody client1
root@webserver:/usr/local/etc/openvpn/ccd # chmod 644 client1


и эту операцию повторяем для всех наших созданных клиентов в итоге должно получиться следующее:

drwxr-xr-x  2 nobody  nobody  512 Feb 27 19:37 .
drwxr-xr-x  6 root    wheel   512 Feb 27 19:37 ..
-rw-r--r--  1 nobody  nobody    0 Feb 14  2012 client1
-rw-r--r--  1 nobody  nobody   33 Feb 27 19:37 client2
-rw-r--r--  1 nobody  nobody   34 Feb 27 19:22 client3


Конфигурирование окончено, запускаем службу:

root@webserver: # /usr/local/etc/rc.d/openvpn start

Если служба запустилась без ошибок, значит все сделано верно, если  все таки ошибки есть то смотрим из в логах и исправляем.

4. Конфигурирование клинской стороны.
Сконфигурировав, настроив и запустив серверную часть, приступаем к настройке клиентской части.

Настройка клиентской части заключается:
- установке на стороне клиента клиентского приложения openvpn;
- создание файла конфигураций client. ovpn;
- копирование ключей и сертификатов с сервера для клиента.

Скопировать клиенское приложение для любой ОС можно прямо с сайта: http://openvpn.net/index.php/download.html, выбрав необходимое приложение для вашей ОС? В моем случае это Windows.

Теперь привожу пример файла клиентской конфигурации в файле client. ovpn:

remote IP адрес  принимающего сервера
port 1194
proto udp
dev tap
ca ca.crt
cert client.crt
key client.key
dh dh1024.pem
keepalive 10 120
comp-lzo
persist-key
persist-tun
ifconfig 172.16.10.8 255.255.255.0
route-method exe
route 192.168.0.0/24 255.255.255.0 172.16.10.1
verb 4
tls-client


Для клиента с сервера необходимо взять такие файлы:  ca.crt, dh1024.pem, client.crt, client.key. Все это скопировать их в ту же папку, где помещен файл клиентской конфигурации. По умолчанию это:

C:\Program Files\OpenVPN\c config\


Запускаем opevpn на клиентской стороне и нажимаем ”Connect” и се работает!

5. Настройка маршрутизации между сетами
Если по окончанию настройки и запуска системы при соединении клиента с сервером загораются зеленые экранчки, но ping и tracert не проходит, то добавляем в rc.conf строку:

pf_enable="YES"

И в папке /etc/ создаем файл pf.conf и в него прописываем следующее:

#Внешний интерфейс
ext_if=bge0

#Внутрений интерфейс
int_if=bge1

localnet="192.168.0.0/24"

# Правила маршрутизации между интерфейсами
nat on $ext_if from $localnet to any -> ($ext_if)
nat on $int_if from 172.16.10.0/24 to any -> ($int_if)


Перезапускаем сервер и проверяем как все работает.

Евгений Прищепа, начальник отдела информационных технологий компании Watson Telecom, аспирант ВНЗ ВМУРоЛ "Украина" с специальности: "Компьютерные системы и компоненты"