Настройка OpenVPN сервера

OpenVPN — свободная реализация технологии виртуальной частной сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT-firewall, без необходимости изменения их настроек. Для обеспечения безопасности управляющего канала и потока данных OpenVPN использует библиотеку OpenSSL. Благодаря этому задействуется весь набор алгоритмов шифрования, доступных в данной библиотеке.

Имеем:

Ось FreeBSD (тут не принципиально, можно поднимать сервер на любой операционке. Настройки в системах Linux ничем не будут отличаться, разве что по-другому устанавливается программное обеспечение).

em0=10.0.2.15/24 - сетевая карта смотрит к провайдеру (наружу)

em1=192.168.30.1/24 — сетевая карта смотрит внутрь локальной сети

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

Ставим из портов:

#cd /usr/ports/security/openvpn20

#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/

Внимание! Если у вас по умолчанию не баш, то перед следующими операциями нужно набрать в консоли "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) [RU]:RU

#Провинция

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

#Город

Locality Name (eg, city) []:Moscow

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

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

# Провинция

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

# Город

Locality Name (eg, city) []:Moscow

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

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

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

Locality Name (eg, city) []:Moscow

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

Создаем ключ Диффи Хельман:

# ./build-dh

И наконец создаем ключ для tls-аутификации:

# openvpn --genkey --secret keys/server/ta.key

Теперь выходим из sh написав команду "exit".

После всех этих манипуляций в папке 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

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

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

#mkdir /usr/local/etc/openvpn

#mkdir /usr/local/etc/openvpn/keys

#mkdir /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

#задаем маршрут, который передаём клиенту и маску подсети для того чтобы он "видел" # сеть за vpn сервером (сеть 192.168.1.0/24)

push "route 192.168.5.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

# таймаут до reconnect

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

# Не закрывать и переоткрывать 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 (имя файла - имя которому выдан сертификат) следующего содержания:

#echo "ifconfig-push 10.10.200.2 10.10.200.1" > /usr/local/etc/openvpn/ccd/client

Сервер готов

Для автостарта при загрузке 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. Настраиваем клиента openvpn под Windows

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

Содержимое файла openvpn.ovpn:

dev tun

proto udp

remote 10.0.2.15#(реальный ip вашего сервера)

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


НЬЮАНС!

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

ifconfig-push 10.10.200.2 10.10.200.1

этой строкой организовываем езернет-тун с сеткой 10.10.200.0, 2-мя машинами с ip 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

 

unix-way