OpenVPN установка и настройка сервера под Gentoo linux
OpenVPN — свободная реализация технологии Виртуальной Частной Сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Более подробно можно почитать на WikiPedia
Встала у меня необходимость подключаться к компьютеру с серым IP, у которого нет никакой возможности получить белый IP. Однако, вспомнив, что у меня есть домашний мини-сервер в белый постоянным IP было решено установить на него VPN сервер, к которому сможет подключиться компьютер с серым IP, а дальше уже, после подключения, сервер мог бы направлять запросы на клиента с серым IP.
Настройка конфигурации ядра
Для начала нам нужно пересобрать ядро системы с включённой опциец TUN/TAP. Я включил её не как отдельный LKM, а встроил в ядро.
Linux Kernel Configuration: 3.1.6 kernel config с поддержкой TUN/TAP |
Device Drivers ---> [*] Network device support ---> <*> Universal TUN/TAP device driver support |
Для того, чтобы вспомнить, как собрать ядро можно почитать краткий мануал. После пересборки ядра незабываем загрузиться в него.
Установка OpenVPN под Gentoo
В Gentoo пакет ставится следующим образом: net-misc/openvpn-2.2.2
Проверям USE флаги. Use Flags: lzo ssl (?) Остальные USE флаги были выключенны.
Далее как обычно
Генерация сертификатов, ключей, а так же параметров Диффи-Хеллмана
Процедура достаточно простая, однако, для более глубокого познания процесс можно почитать вот тут.
Для генерации ключей надо установить пакет
если он не поставился у вас автоматом с openssl (это как я понимаю зависит от параметров компиляции openssl).
Настройка параметров ключей
В новой версии openVPN инструмент для настройки ключей уже не поставляется вместе с пакетом и его нужно установить отдельно.
Сперва нам нужно создать файлик vars, где будут находиться все базовые параметры необходимые для создания PKI.
Сделать его можно на основе vars.example.
Для этого выполняем:
Теперь занёс в файл vars требуемые начальные параметры.
У меня получилось что-то типа:
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Russia"
set_var EASYRSA_REQ_CITY "Moscow"
set_var EASYRSA_REQ_ORG "Donik Corporation"
set_var EASYRSA_REQ_EMAIL "admin@donik.org"
set_var EASYRSA_REQ_OU "Donik Unit"
В принципе всё это не так важно =)
Процедура выпуска ключей
Процедура состоит из этапов:
- Генерация ключа и сертификата удостоверяющего центра
- Генерация ключей и сертификатов сервера
- Генерация ключей и сертификатов клиентов
- Генерация файла Дефи-Хеллмана для безопастной авторизации
Теперь выполняем команды из той же папки, куда мы перешли чуть ранее /usr/share/easy-rsa:
Заходим в папку, если ещё не зашли
Создаём инфраструктуру для генерации ключей
Создаём ключ удостоверяющего центра, который и будет всё подписывать
На вопрос Common Name можно ввести donik.org, как адрес нашего удостоверяющего центра. Он нигде особо не понадобится.
Удаляем пароль (passphrase) из ключа удостоверяющего центра
Он в принципе мог бы и сотаться, но для удобства его можно удалить.
После инициализации приступаем к выпуску ключей для сервера и клиента.
Выпускаем сертификат для сервера
Большинство параметров пройдут как и раньше по дефолту благодаря нашей подготовке в самом начале. На вопрос Common Name ввести server.
Удаляем passphrase
Выпускаем сертификат для клиента
Удаляем passphrase
На вопрос Common Name нужно ввести имя клиента: client, client2, client3 и т. д. если у нас много разных клиентов.
Генерируем параметры Диффи-Хеллмана
Этот файлик поможет произвести первое рукопожатие для авторизации по не безопастному протоколу, для последующей обмены ключами и установки безопастного конекта
Куда какие ключи положить
Теперь мы имеем в папке ./pki сертификаты и ключи. В общем полный набор для всех (удостоверяющий центр (поможет в будущем генерировать новые ключи), сервер, клиенты)
Далее мы должны по безопастному каналу переместить на клиента следующие файлы:
- ca.crt (сертификат удостоверяющего центра)
- client.crt (сертификат клиента для авторизации)
- client.req(запрос на выпуск сертификата, для туннеля он не нужен)
- client.key (приватный ключ клиента)
Для большей безопастности можно использовать как авторизацию по ключу, а так же и шифрование по сертификату одновременно. Для этого перенесём файлы, которые нужны будут серверу в его специальную папку, путь к которой будем использовать в конфиге сервера.
После чего, забрав клиентские файлики мы можем забэкапить папку PKI и удалить с сервера. В будущем, если потребуется новый выпуск ключей клиентам, мы можем её восстановить, и используя уже имеющуюся инфраструктуру продолжить генерацию ключей клиентам.
Переносим в паку выше файлы сервера:
- ca.crt
- dh.pem
- server.crt
- server.key
- server.req
Конфигурирование OpenVPN сервера
У меня достаточно простая конфигурация сервера, конфиг которого я постарался снабдить подробными комментариями (правда на английском):
# non default port to prevent worm attacks!
port 2194
#udp is a bit faster but tcp is more stable, choosing tcp
proto tcp
#creating network tunnel for IP pachets management. we don't need TAP here for ethernet's frames management
dev tun
#paths to our certificates, private keys and Diffie Hellman params file
ca privnet/ca.crt
cert privnet/server.crt
key privnet/server.key
dh privnet/dh1024.pem
#encryption algorythm
cipher AES-256-CBC
#config VPN subnet as 10.8.0.0/24
server 10.8.0.0 255.255.255.0
#give clients same IPs if it's free when client connected respecting ipp.txt.
#zero at the end means don't recreate it automaticly.
ifconfig-pool-persist ipp.txt 0
#ping clients every 10 seconds and if no reply was recivied in 120 seconds then restart tunnel
keepalive 10 120
#enable trafic compression via lzo algorithm
comp-lzo no
#what user and what group will be used to run openvpn service (not priviliged user used here)
user nobody
group nobody
#not reread key files after tunnel restarts
persist-key
#don't do anything to tun device after restarting openvpn
persist-tun
#file with clients that established connection at this moment
status openvpn-status.log
#set log verbose level to 3 out of 11
verb 3
#don't rewrite log file - only append at the end of file
log-append /var/log/openvpn.log
#allow client-to-client connections throught our server
client-to-client
Запускаем демон
и добавляем его в автозагрузку:
Указываем статические адреса клиента
Данный метод согласно документации не даёт 100% гарантии, но вполне рабочий и очень простой. Правим файлик ipp.txt занося туда CN клиента (у нас они шли как clint, client1, client2 и т.д.), а потом желаемый IP.
client,10.8.0.4
Конфигурирование OpenVPN клиента под Windows 7 64 bit
Для проверки работоспособности нашего сервера необходимо поставить VPN клиента на стороннюю машину и протестировать всё. Я выбрал Windows, так как использую его как свою десктоп ОС.
Сперва необходимо скачать программу с официального сайта [1]. В самом низу страницы будет Windows Installer (64-bit).
После установки программы заходим в папку c:\Program Files\OpenVPN\config\ где, запустив блокнот от имени администратора, создаём конфиг client.ovpn:
client
dev tun
proto tcp
#enforce server certificate verification by clients
remote-cert-tls server
remote YOUR_SERVER_IP_OR_DOMAIN 2194
resolv-retry infinite
nobind
persist-key
persist-tun
#encryption algorythm
cipher AES-256-CBC
#execute routing commands to cause all outgoing traffic to be redirected over the VPN
redirect-gateway
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 3
Далее в папку с конфигом нам нужно положить наши ключи и сертификат, которые мы ранее выделили как клиентские:
- ca.crt
- client.crt
- client.req (не обязателен, он был нужен для запроса на выпуск ключа от удостоверяющего центра)
- client.key
После чего нам нужно запустить OpenVPN GUI от имени администратора и два раза кликнуть на иконке OpenVPN в трее. Проверить установку связи можно пингами в обе стороны.
Если у клиента был выдан такой IP ;)
Ссылки
- Статья на моём любимом сайте, которая легла в основу данного мануала
- Официальная инструкция к OpenVPN
- страница скачивания программы
- Описание на русском языке всех параметров конфига OpenVPN
- Пост на Хабре, который дал пару подсказок для меня
- TUN TAP на Wikipedia