VPN через openvpn

vpn нужен для связи офисов, которые находятся в разных местах, что бы они видели друг друга как-будто они находятся в одной локальной сети. Существует много реализаций vpn’a. В этой статье расскажу, как это сделать на openvpn.

1)Установка.

Идём в порты, и ставим openvpn (заметьте! без clean):

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

После этого создаём папку /usr/local/etc/openvpn, копируем в неё папку/usr/ports/security/openvpn/work/openvpn-2.0.6/easy-rsa и только после этого делаем clean в директории /usr/ports/security/openvpn.

Если он за собой не установил openssl, то идём в порты и ставим :

#/usr/ports/security/openssl && make install clean

2)Сертификаты.

Для работы с openvpn вам нужно будет сгенерировать сертификаты. И так, приступим (при создании можно вводить любую информацию, в том числе и ничего не вводить, а просто жатьEnter):

#cd /usr/local/etc/openvpn/easy-rsa/2.0
#source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/etc/openvpn/easy-rsa/2.0/keys
#sh ./clean-all

Если у вас оболочка csh/tcsh или ругается, что не знает команды export, то выход такой: переключать на оболочку shell и там генерить ключи (вторая строка так и вводится: точка, пробел, точка, слэш vars; точка вначале строки заменяет команду source, которой нет в классической shell).

# sh -E
# . ./vars
# sh ./clean-all

Создаём главный CA-серфтикат:

#sh ./build-ca
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) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [Fort-Funston]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:
Email Address :

Создаем сертификат X.509 для сервера:

#sh ./build-key-server server
Generating a 1024 bit RSA private key
.....++++++
........................................++++++
writing new private key to 'server.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) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [Fort-Funston]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) :
Email Address :

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/local/etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :PRINTABLE:'CA'
localityName          :PRINTABLE:'SanFrancisco'
organizationName      :PRINTABLE:'Fort-Funston'
commonName            :PRINTABLE:'server'
emailAddress          :IA5STRING:'me@myhost.mydomain'
Certificate is to be certified until Oct 19 10:50:17 2019 GMT (3650 days)
Sign the certificate? :y

1 out of 1 certificate requests certified, commit? y
Write out database with 1 new entries
Data Base Updated

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

#sh ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
...........+.......................+...............................

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

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

Для генерации клиентских ключей используем такие команды:

# cd /usr/local/etc/openvpn/easy-rsa/2.0
# source ./vars
# ./pkitool username_of_key

Теперь в папке keys окажутся нужные ключи. Переносим их в папку /usr/local/etc/openvpn. Вот какое у них назначение:

# ca.crt — Главный CA сертификат, этот файл нужен и клиенту и серверу
# dh1024.pem — ключ Диффи Хельман, этот файл нужен только серверу
# server.crt — Сертификат сервера, нужен только серверу
# server.key — Ключ сервера, нужен только серверу (СЕКРЕТНЫЙ файл)
# client.crt — Сертификат клиента, нужен только клиенту
# client.key — Ключ клиента, нужен только клиенту (СЕКРЕТНЫЙ файл)
# ta.key — TLS-ключ, нужен и клиенту и серверу
# XX.pem — файл идентификаторы ключей, где XX — шестнадцатиричное значение.

3) Настройка сервера.

Переходим в папку /usr/local/etc/openvpn, создаём файл openvpn.conf такого содержания:

#порт входящих соединений (его слушает сервер)
port 2294
#протокол работы
proto udp
#устройство работы (может быть tun/tap)
dev tun
#указываем файл CA
ca ca.crt
#указываем файл с сертификатом сервера
cert server.crt
#указываем файл с ключем сервера
key server.key
#указываем файл Диффи Хельман
dh dh1024.pem
# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth ta.key 0
# местонахождение списка отзыва сертификатов
crl-verify /usr/local/etc/crl.pem
#Если хотите, что бы клиенты видели друг друга (по дефолту,
#без этой строки клиенты видят только сервер - друг друга не видят)
client-to-client
#задаем сеть для VPN'a
server 10.0.11.0 255.255.255.0
#задаём подсети, которые будет видеть клиент.
push "route 10.0.11.0 255.255.255.0"
push "route 10.0.101.0 255.255.255.0"
push "route 10.0.102.0 255.255.255.0"
push "route 10.0.103.0 255.255.255.0"
#задаём DNS-сервера для VPN'a
push "dhcp-option DNS 10.0.101.100"
push "dhcp-option DNS 10.0.102.225"
#если хотим, что бы дефолтный шлюз клиента менялся
#на VPN'овский, добавляем строк
#push "redirect-gateway"
#указываем папку с настройкам, специфичные для конкретного клиента
#(в папке содержаться файлы с именем клиента. Опции, записанные
#в таких файлах переопределяют те, которые записаны в конфиге
#сервера. Если файл отсутствует, то настройки берутся из конфига сервера)
client-config-dir /usr/local/etc/ccd
# включаем TLS аутификацию
tls-server
# сжатие трафика
comp-lzo
# максимум клиентов
#max-clients 100
#Метод шифрования ключей
cipher AES-256-CBC
#юзер и группа, от которого работает openvpn
user nobody
group nobody
# Не перечитывать ключи после получения
# SIGUSR1 или ping-restart
persist-key
# Не закрывать и переоткрывать TUN\TAP
# устройство, после получения
# SIGUSR1 или ping-restart
persist-tun
#лог со статусом
status /var/log/openvpn/status.log
#лог самого сервера
log-append /var/log/openvpn/openvpn.log
#уровень логгирования
verb 3
#проверка "живучести" удалённого пира.
#каждые 10 секунд обе стороны посылают ping-пакет
#и ждут 120 секунд для обратного ответа
#если ответа нет - соединение сбрасывается
keepalive 10 120

#Включаем возможность управлять в realtime работой демона
#В файле management.pwd содержится пароль в чистом виде
management 127.0.0.1 5555 /usr/local/etc/openvpn/management.pwd

Создаём папку /usr/local/etc/ccd и ставим права 0555 на неё, создаём файл/usr/local/etc/openvpn/management.pwd и ставим на него права 0600root:wheel

А теперь внимание: запуск сервера. Стандартный запуск меня не устраивал, ибо  у меня, по неизвестным причинам часто падал openvpn, поэтому пришлось написать скрипт запуска. Вот он:

#!/bin/sh
while :; do
/usr/local/sbin/openvpn --cd /usr/local/etc/openvpn --config /usr/local/etc/openvpn/openvpn.conf >> /var/log/openvpn/openvpn.log
done

Называем его, например, openvpn.sh, делаем исполняемым и ложим в папку /scripts. Далее в папке /usr/local/etc/rc.d создаём скрипт такого содержания:

#!/bin/sh
/scripts/openvpn.sh &

4)Настройка клиента

Вот конфиг клиента:

#собственно клиент
client
#устройство
dev tun
#включаем TLS аутификацию
tls-client
# протокол
proto udp
#удалённый сервер
remote XX.XX.XX.XX 2294
#поддеживать возможность резолвить имена через сервер
resolv-retry infinite
#без привязки по порту (на клиентской стороне)
nobind
#проверка серверного сертификата
ns-cert-type server
#уровень логгирования
verb 3
# включаем шифрацию пакетов
cipher AES-256-CBC
# сжатие трафика
comp-lzo
#сертификаты
ca C:\\vpn\\ca.crt
cert C:\\vpn\\client_name.crt
key C:\\vpn\\client_name.key
dh C:\\vpn\\dh1024.pem
tls-auth C:\\vpn\\ta.key 1
persist-key
persist-tun

Если у вас vista и выше (Windows 7/8/…) то в конфиг клиента добавляем ещё такие строки:

route-method exe
route-delay 2

За дополнительными параметрами обращайтесь к справочным руководствам или на сайт http://openvpn.net

5) Проблемы

В новых версиях мобильного приложения под IOS 1.2.5 разработчики много чего поменяли и, кое-что может не работать. Подробнее можно прочесть:

OpenVPN Connect for iOS issues


https://forums.openvpn.net/viewtopic.php?p=75559#p75544
https://community.openvpn.net/openvpn/ticket/979

VPN через openvpn: 1 комментарий

  1. gazizeldar

    Статья очень занимательная , сделал себе по ней,
    но при создании серификатов после команды
    . vars предлагалось сделать ./clean
    но у меня не получалось , гугление дало найти причину , дело было в правах
    сделал для папки 2.0 следующее и все пошло!
    # chmod -R 544 2.0
    # chmod 755 2.0
    Вдруг кому понадобиться!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *