OpenVPN сервер на шлюзе Debian c FireHOL.

Задача: Настроить безопасный доступ к ресурсам локальной сети из интернет.

/* Имеется корпоративная сеть, соединенная с миром посредством сервера и реального статического айпи. Сотрудникам находящимся в командировке или работающим дома, требуется возможность безопасного подключения к сети и ее ресурсам. Для этого служит технология VPN (Virtual Private Network — виртуальная частная сеть). В случае использования клиентом интернет от данной локальной сети, настоящая точка подключения будет маскироваться. Безопасность обеспечивается надежным шифрованием и защищенной аутентификацией. В данной статье используется свзяка — Debian Etch, OpenVPN, FireHOL. */

open-vpn-debian-firehol-schema

Условия:

На момент написания статьи: шлюз на Debian Etch 2.6.18-6-686, пакет OpenVPN 2.0.9-4etch1, брэндмауэр  FireHOL 1.231-7.

Подробная инструкция:

Генерация ключей шифрования OpenSSL:

Установка необходимых пакетов от имени привилегированного пользователя

# aptitude install openvpn openssl firehol

Находим и копируем скрипты генерации сертификатов и ключей (easy-rsa) из источника в рабочий каталог

# cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn/

Правим параметры по желанию, я изменил город, страну, провинцию, организацию, адрес электронной почты

# vi /etc/openvpn/easy-rsa/vars

Инициализируем PKI (Public Key Infrastructure)

# cd /etc/openvpn/easy-rsa
# ./vars
# ./clean-all

Генерируем Certificate Authority (CA) сертификат и ключ. Будет создан ca.crt — файл главного Certificate Authority сертификата. Большинство параметров подхватятся из файла vars. Только параметр Common Name надо указать явно.

# ./build-ca
Common Name (eg, your name or your server’s hostname) []: MyServer

Генерируем X.509 сертификат для сервера — появится пара файлов server.crt и server.key

# ./build-key-server server

Генерируем такой же сертификат для клиента — client.crt и client.key

# ./build-key client

Будьте внимательны при заполнении данных сертификатов, поле Common Name обязательно к заполнению, причем для сервера оно должно быть одно, а для клиента другое. Например в поле Common Name при генерации сертификата X.509 для сервера можно написать server, а для клиента соответственно client

Генерируем ключ Диффи-Хельмана — dh1024.pem

# ./build-dh

Генерируем ключ для TLS-аутентификации

# openvpn —genkey —secret keys/ta.key

Итак, после всех этих манипуляций в папке keys получается много файлов:

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.

Нам надо скопировать серверные в нужное место (в /etc/openvpn):

# cp ./keys/ca.crt /etc/openvpn
# cp ./keys/server.crt /etc/openvpn
# cp ./keys/server.key /etc/openvpn
# cp ./keys/dh1024.pem /etc/openvpn

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

Создаем конфигурационный файл /etc/openvpn/server.conf следующего содержимого:

proto tcp #Сервер слушает только tcp-порт
dev tun #используемый тип устройства tun
port 1194 #используемый порт 1194
#tls-server #включаем TLS аутентификацию
#tls-auth ta.key 0 #указываем tls-ключ, и указываем 0- для сервера, а 1- для клиента
ca ca.crt #указываем файл CA
cert server.crt #указываем файл с сертификатом сервера
key server.key #указываем файл с ключем сервера
dh dh1024.pem #указываем файл Диффи Хельман
#cipher DES-EDE3-CBC #включаем шифрацию пакетов Triple-DES
mode server #включаем режим сервера
server 10.4.7.0 255.255.255.0 #задаем сеть и маску сети. В моем случае серверу будет автоматически назначен 10.4.7.1
push «dhcp-option DNS 10.4.7.1″ #отправляем клиентам строку, с указанием ДНС
#push «redirect-gateway» #назначать себя шлюзом по умолчанию на клиенте
duplicate-cn #ВАЖНО! разрешаем пользоватся одним и тем же ключем, нескольким клиентам одновременно, иначе прийдется для всех клиентов генерировать отдельные сертификаты.
user nobody #устанавливаем OpenVPN-демону права пользователя nobody
max-clients 10 #максимальное число одновременно подключенных клиентов
#persist-tun #Не закрывать и переоткрывать TUN\TAP устройство, после получения SIGUSR1 или ping-restart
#persist-key #Не перечитывать ключи после получения SIGUSR1 или ping-restart
comp-lzo #Включить сжатие траффика
keepalive 10 120 #Проверка жизни клиента каждые 10 секунд, если в течении 120 секунд не пришел ответ, то закрывается соединение
verb 3 #Уровень информации для отладки

Сервер настроен

Запуск демона OpenVPN

# /etc/init.d/openvpn start

должно написать server (OK), если нет, открываем логи..

Настройка FireHOL

Добавим необходимые правила в файл конфигурации оболочки iptables — firehol — /etc/firehol/firehol.conf

version 5

# — SERVERS —
server_vpn_ports=»tcp/1194″ #описание сервиса vpn
client_vpn_ports=»default»

# — ROUTERS —
HOST_ROUTER_GLOBAL=»www.xxx.yyy.zzz» #здесь указываем наш реальный айпи
HOST_ROUTER_LOCAL=»192.168.0.1″
HOST_ROUTER_LOCAL_MASK=»192.168.0.0/24″

# —— POICIES ——
UNMATCHED_INPUT_POLICY=reject #здесь общие настройки безопасности
UNMATCHED_OUTPUT_POLICY=reject
UNMATCHED_ROUTER_POLICY=reject

FIREHOL_LOG_MODE=»LOG»
FIREHOL_LOG_FREQUENCY=»10/minute»
FIREHOL_LOG_BURST=»2″
FIREHOL_LOG_PREFIX=»FIREHOL: »

# ——— INTERFACES ———
HOME_IF=»eth1″ #описание интерфейсов
HOME_IP=»${HOST_ROUTER_LOCAL}»
HOME_MASK=»${HOST_ROUTER_LOCAL_MASK}»

INET_GLOBAL_IF=»eth0″
INET_GLOBAL_IP=»${HOST_ROUTER_GLOBAL}»

VPN_IF=»tun0″
VPN_IP=»10.4.7.1″
VPN_MASK=»10.4.7.0/24″

# ————— VIRTUAL SERVERS —————
INT_SERVERS=»ssh …  vpn» #вместо троеточия — все необходимые серверные демоны
EXT_SERVERS=»ssh … vpn»

INT_CLIENTS=»ssh … vpn» #вместо троеточия — все необходимые клиентские подключения
EXT_CLIENTS=»all»

INT_ROUTER_CLIENTS=»all»
EXT_ROUTER_CLIENTS=»ssh … vpn» #вместо троеточия — все необходимые внешние клиентские подключения маршрутизатора

INT_ROUTER_SERVERS=»none»
EXT_ROUTER_SERVERS=»all»

#——————— NAT & DNAT —————————
nat to-source «${INET_GLOBAL_IP}» outface «${INET_GLOBAL_IF}»
nat to-source «${HOME_IP}» outface «${HOME_IF}»
nat to-source «${VPN_IP}» outface «${VPN_IF}»

#—————————— DEFENITION OF INTERFACES —————
interface «${INET_GLOBAL_IF}» GLOBAL src not «${HOME_MASK}» dst «${INET_GLOBAL_IP}»
policy reject
protection full 10 20
server «${EXT_SERVERS}» accept
client «${EXT_CLIENTS}» accept
server ident reject with tcp-reset

interface «${HOME_IF}» LAN src «${HOME_MASK}» dst «${HOME_IP}»
policy reject
protection strong 10 20
server «${INT_SERVERS}» accept
client «${INT_CLIENTS}» accept
server ident reject with tcp-reset

interface «${VPN_IF}» VPN src «${VPN_MASK}» dst «${VPN_IP}»
server all accept
client all accept

#———————— DEFENITION OF ROUTERS ———————-
router GLOBAL2LAN inface «${INET_GLOBAL_IF}» outface «${HOME_IF}»
server «${EXT_ROUTER_SERVERS}» accept
client «${EXT_ROUTER_CLIENTS}» accept
masquerade reverse
route ident reject with tcp-reset

router GLOBAL2VPN inface «${INET_GLOBAL_IF}» outface «${VPN_IF}»
server all accept
client all accept
masquerade reverse

router VPN2LAN inface «${VPN_IF}» outface «${HOME_IF}»
server all accept
client all accept
masquerade reverse
#———————————-THE END—————————————

Проверяем нашу конфигурацию брандмауэра:

# firehol /etc/firehol/firehol.conf

если ошибок нет, поддтверждаем транзакцию, после чего конфигурация вступит в силу и сервер включиться:

commit

проверяем, активируется ли наш брандмауэр при следующей загрузке сервера, если нет, включаем:

# cat /etc/default/firehol
START_FIREHOL=YES

Настройка сервера полностью завершена, осталось настроить клинетов, и выдать им ключи.

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

Генерируем ключи PKCS #12 клиенту на сервере

# cd /etc/openvpn/easy-rsa
# .  ./vars (загружаем переменные в оболочку)
# ./build-key-pkcs12 client1 (Создаем ключ PKCS #12 клиенту1)

Из папки ./keys на сервере забираем файл client1.p12 и отдаем клиенту, который сохранит файл в папке с установленной далее программой, и т.д. для каждого отдельного клиента.

Скачиваем последний OpenVPN-GUI под windows (http://openvpn.se/download.html), устанавливаем, создаем в папке C:\Program Files\Open VPN\config, файлик client.ovpn со следующим содержимым:

remote www.xxx.yyy.zzz 1194 #хост, к которому присоединяемся
proto tcp #протокол
port 1194 #порт
dev tun #используемый тип устройства
client #режим работы
ping 10
comp-lzo #Включить сжатие траффика
persist-tun #Не закрывать и переоткрывать TUN\TAP устройство, после получения SIGUSR1 или ping-restart
persist-key #Не перечитывать ключи после получения SIGUSR1 или ping-restart
resolv-retry infinite #количество повторов соединения
tls-client #указываем, что подключение осуществляется по средствам tls-ключа
#tls-auth ta.key 1 #указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
#dh dh1024.pem #указываем файл Диффи Хельман
#ca ca.crt #указываем файл CA
#cert client.crt #указываем файл с сертификатом клиента
#key client.key #указываем файл с ключем клиента
#cipher DES-EDE3-CBC # Triple-DES #включаем шифрацию пакетов
pkcs12 c:\\progra~1\\openvpn\\config\\client1.p12
verb 3 #Уровень информации для отладки
pull
redirect-gateway #ВАЖНО! переназначить стандартный шлюз на шлюз VPN

и закидываем в эту же папку клиентский набор ключей ***.

Подключение клиента

Перезапускам OpenVPN-GUI. Нажимаем правой кнопкой мышки по значку в системном лотке, и выбираем Connect — в списке подключений появится наше подключение, выбираем его, вводим пароль, который мы устанавливали при генерации ключа — наслаждаемся. Проверяем, какие ресурсы локальной сети нам доступны.

Важные замечания

*** В файлах конфигурации клиента и сервера — закомментированные строки — ключи  и шифрование — подготовленные, но не использовалось мною при написании статьи. Настоятельно рекомендую включить, и работать с полными возможностями защиты.

Возможные проблемы

а) Могут быть сбиты часы на сервере и на клиенте — тогда сертификаты и ключи могут не заработать — будет писать что сертификат или ключ еще или уже не действителен.
б) На клиенте прописан шлюз по умолчанию и openvpn по каким то причинам не смог его заменить — выход — прописать статический маршрут на VPN сервер через этот шлюз, а шлюз по умолчанию убрать.
в) Совпадают адреса локальных сетей из которой мы подключаемся, с адресом самой VPN.

Используемые материалы и полезные ссылки по теме:

http://elwood.su/2008/11/%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b0%d1%8f-%d1%83%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%ba%d0%b0-openvpn-%d0%bd%d0%b0-vds-%d1%81-debian/
https://zloy.org/print_n54105_desc-Nastroika-VPN-na-osnove-OpenVPN.html
http://www.netlly.ru/?q=node/23/
http://dedicatesupport.com/archives/8
http://help.mirhosting.com/?documentId=49
http://dedicatesupport.com/archives/32
http://www.opennet.ru/openforum/vsluhforumID10/3564.html#1

p.s. С благодарностью к Авторам перечисленных выше программ, ресурсов, статей, а также к тебе Незнакомец.