Форум русскоязычного сообщества Ubuntu


Автор Тема: [HOWTO] OpenVPN + SSL/TLS  (Прочитано 40993 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Protopopulus

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1686
  • ちのう の きょうかん
    • Просмотр профиля
[HOWTO] OpenVPN + SSL/TLS
« : 02 Февраль 2012, 10:42:04 »
Целый день угрохал на понимание того, для чего нужны всякие сертификаты и ключи, мучился несколько часов, экспериментируя с OpenVPN... Делюсь с народом собственным маном (ибо на help.ubuntu.ru не понятно) :)

1. Что такое OpenVPN и для чего оно надо?
OpenVPN - это отличная программа для создания виртуальных частных сетей (Virtual Private Network) с широкими возможностями по защите передаваемого трафика криптографическими методами. Пригодиться VPN может любому, кто хочет объединить несколько сетей или компьютеров в одну сеть, например, локальные сети филиалов компании в одну общую или несколько домашних компьютеров, находящихся в разных городах или за NAT-сервером провайдера. Подробнее можно почитать на официальном сайте http://openvpn.net или Википедии.

Установка:
# apt-get update
# apt-get install openvpn

2. Возможности OpenVPN по шифрованию
OpenVPN можно использовать в нескольких режимах, в том числе и без шифрования трафика, но в таком случае мы просто не сможем соединить более двух компьютеров (да и зачем "светить" свой трафик всем желающим?). Поэтому, перейдем сразу к теории... Работает это хитрое дело на так называемых сертификатах и ключах:

2.1. Асимметричное шифрование - это такой вид шифрования, когда используется связанная пара ключей (открытый и закрытый), с помощью которых можно шифровать что-либо таким образом, что , например, сообщение, зашифрованное открытым ключом, можно расшифровать только закрытым (для некоторых алгоритмов шифрования, возможно и обратное). Поэтому, если мы желаем получать конфиденциальные сообщения, нам нужно дать свой открытый ключ тому, кто будет шифровать для нас сообщения, а закрытый ключ будет лежать у нас в надежном сейфе и никто, кроме нас не сможет расшифровать сообщение.

2.2. Электронная цифровая подпись. В виду того, что некоторые алгоритмы асимметричного шифрования позволяют шифровать сообщения закрытым ключом, а расшифровывать открытым и наоборот, мы можем зашифровать некое сообщение закрытым ключом и любой желающий сможет убедиться, что это сообщение отправлено именно нами, когда расшифрует его открытым ключом (который доступен каждому). То есть, мы можем как бы поставить подпись.
2.3. Цифровой сертификат - документ, удостоверяющий принадлежность ключей конкретному лицу. В сертификате указывается кто именно владеет ключами, содержится открытый ключ, отпечаток закрытого ключа (не сам ключ), срок действия сертификата, электронная подпись лица, выдавшего сертификат и информация о том, кто его выдал. Если коротко и "на пальцах", то это электронный документ, который нам выдал уважаемый всеми Борис Серафимович, которому все доверяют и на котором есть его подпись. Сертификат не является тайной и его можно спокойно опубликовать., он будет подтверждать, что сообщения, подписанные нашим закрытым ключом подписаны именно нами и ни кем другим и Борис Серафимович тому гарант.Существуют центры сертификации, которые за приличные барыши могут подписать нам ключи, но платить не очень хочется... В таком случае мы сами себе можем выдать такой сертификат и заверить им свои ключи. Такой сертификат называется самоподписанным и служит для заверения других ключей, принадлежащих кому-нибудь другому.Приступим. Создадим самоподписанный сертификат и закрытый ключ, которыми мы будем заверять ключи и сертификаты клиентов, желающих подключиться к нашему серверу. Я не стал использовать скрипты, поставляемые в комплекте с OpenVPN, потому что хотел сам разобраться что к чему и как работает. Делается это с помощью консольной утилиты OpenSSL:
openssl req -new -x509 -keyout my-ca.pem -out my-ca.crtПодробнее: req - запрос на создание сертификата, -x509 - создать самоподписанный сертификат стандарта X.509 (в Википедию, если интересно), -keyout - записать закрытый ключ в файл, -out - записать сертификат в файл. В процессе создания, первым делом, нам предложат ввести пароль для закрытого ключа (крайне важно). Придумываем пароль, вводим, подтверждаем. Далее, будет задано несколько вопросов о том, кто мы такие. Вводим международное обозначение страны, например RU, UA, CN, далее указываем регион, город/село/деревню, название нашей организации, свои ФИО, адрес электронной почты. Все. Наш корневой самоподписанный сертификат готов к употреблению.Далее, нам потребуется создать пару "ключ-сертификат" для каждого клиента, желающего подключиться к нашему серверу. Для этого малость подправим конфиг OpenSSL. Открываем файл /usr/lib/ssl/openssl.cnf и меняем значение параметра policy на:
policy = policy_anythingЭто для того, чтобы можно было подписывать любые сертификаты. После чего создаем следующие папки и файлы (все в той же директории):
mkdir -p ./demoCA/newcerts
touch ./demoCA/index.txt
echo '1' > ./demoCA/serial
(без этого OpenSSL будет сильно ругаться).Теперь генерируем запрос на сертификат для каждого пользователя:openssl req -new -nodes -keyout user_1.pem -out user_1.crs-nodes - означает, что шифровать закрытый ключ не нужно (иначе при каждом запуске туннеля надо будет вводить пароль на ключ). Так же вводим описание для владельца ключа, как и ранее.
И подписываем запрос на сертификат своим самоподписанным:
openssl ca -cert my-ca.crt -keyfile my-ca.pem -days 365 -in user_1.crs -out user_1.crtОтвечаем два раза положительным "игреком" (y), в итоге, получаем связку "ключ-сертификат" для пользователя user_1.Если пользователей много, то можно автоматизировать процесс, задействовав скрипты из комплекта OpenVPN. Ман смотреть тут.
Последние действие - создание параметров Диффи-Хеллмана (исключительно для сервера):
openssl gendh -out server.dh
В общем-то, с криптографией больше возиться не придется. Файлы запросов на сертификаты можно удалить:
rm user_*.crs
3. Настройка сервера.
Перемещаем файлы ключей и сертификатов в любую удобную директорию. Я поместил прямо в папке настроек OpenVPN.
mv ./server.crt /etc/openvpn
mv ./server.pem /etc/openvpn
mv ./my-ca.crt  /etc/openvpn
mv ./server.dh  /etc/openvpn
Далее устанавливаем владельца перемещенных фалов root и на файл server.pem назначаем права 400, безопасности ради.Создаем файл конфигурации /etc/openvpn/server.conf следующего содержания (минимальный конфиг):
user            nobody # не даем привелегий
group           nogroup # процессу OpenVPN

mode            server # включаем сервер
                tls-server # в режиме TLS

ca              /etc/openvpn/my-ca.crt # Наш сертификат, которому "доверяют"
cert            /etc/openvpn/server.crt # Сертификат самого сервера
key             /etc/openvpn/server.pem # Закрытый ключ сервера
dh              /etc/openvpn/server.dh # Параметры Диффи-Хеллмана

dev             tap # Виртуальная сетевая карта
persist-tun # Сохранять устройство при перезагрузке соединения
persist-key # Не перечитывать файлы ключей при перезагрузке соединения

ifconfig        192.168.0.1 255.255.255.0 # Адрес нашего виртуального устройства и маска подсети
topology        subnet # Явно указываем, что это подсеть
proto           tcp-server # Включаем режим "прослушки" по tcp-протоколу (по умолчанию udp)
port            10000 # Указываем портна котором будет "слушать" сервер

max-clients     10 # Максимальное число клиентов

comp-lzo        yes # Включить сжатие трафика
Можно проверить сервер на работоспособность, выполнив команду:
openvpn --config /etc/openvpn/server.confДополнительные параметры настройки сервера (и клиента) смотрим здесь.
4. Настройка клиента.
Чтобы клиент мог подключиться, ему нужно иметь у себя пару "ключ-сертификат", которую мы ранее сгенерировали и наш самоподписанный сертификат (передаем их клиенту в запароленном архиве). Файлы:
my-ca.crt
client_N.pem
client_N.crt
На стороне клиента создаем конфиг /etc/openvpn/client.conf (минимальный):
user            nobody
group           nogroup

ca              /etc/openvpn/my-ca.crt
cert            /etc/openvpn/client_1.crt
key             /etc/openvpn/client_1.pem

dev             tap
persist-tun
persist-key

ifconfig        192.168.0.2 255.255.255.0 # Адрес устройства клиента маска подсети (должна совпадать с маской сервера)
topology        subnet
                nobind #  использовать динамический порт для подключения

proto           tcp-client
                tls-client

port            10000

comp-lzo        yes
Подключаемся к серверу:
openvpn --remote АЙПИСЕРВЕРА --config /etc/openvpn/client.conf, где АЙПИСЕРВЕРА - внешний белый IP сервера.В общем-то, все. Сервер работает и принимает несколько соединений.З.Ы. Если есть чем дополнить или где поправить - милости просим.
« Последнее редактирование: 02 Февраль 2012, 18:30:44 от Protopopulus »
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн RustemNur

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2914
  • умрешь с вами
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #1 : 02 Февраль 2012, 12:18:18 »
Тему я пока прикрепил, пусть пробуется/обсуждается.

Оффлайн artem.ultra

  • Участник
  • *
  • Сообщений: 226
    • Просмотр профиля
    • Sa-iT
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #2 : 04 Февраль 2012, 20:38:06 »
а вот меня интересует функция
shaperпытался включить, получилось. работает только на исходящий трафик.
а вот мне интересно, можно ли как то шейпить и входящий трафик?

Оффлайн Protopopulus

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1686
  • ちのう の きょうかん
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #3 : 04 Февраль 2012, 21:21:26 »
Я тоже интересовался. Нашел только клиентский шейпер. Видимо, пока не реализовали. Но можно попробовать шейпить трафик на стороне сервера с помощью tc. Правда, я не пробовал.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн artem.ultra

  • Участник
  • *
  • Сообщений: 226
    • Просмотр профиля
    • Sa-iT
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #4 : 06 Февраль 2012, 13:52:35 »
с помощью tc как то не красиво.
было бы на много лучше с помощью самого приложения

Оффлайн Protopopulus

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1686
  • ちのう の きょうかん
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #5 : 07 Февраль 2012, 03:00:17 »
Поскольку исходный код OpenVPN является открытым, то можно попробовать написать и server-side шейпер. :) Поскольку такового в приложении нет, то ответ прост - использовать tc, как нативное средство для управления интерфейсами.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн snwbrdr

  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #6 : 17 Февраль 2012, 02:39:18 »
Баловался на предмет поднятия DHCP на tap интерфейсе
И внесения данных в dns в прямую и в обратную зону.
Так же авторизировать пользователя из AD
Если есть интерес могу поведать

Оффлайн Protopopulus

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1686
  • ちのう の きょうかん
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #7 : 17 Февраль 2012, 03:07:02 »
Полезная информация лишней не бывает. Так что, выкладывай! :)
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн snwbrdr

  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #8 : 17 Февраль 2012, 11:53:51 »


Значит так конфиг openvpn/server-openpvpn.conf

mode server
port 1195
proto udp
dev tap_vpn
server-bridge

ca /etc/openvpn/key/ca.crt
cert /etc/openvpn/key/crt
key /etc/openvpn/key/key
dh /etc/openvpn/key/dh
tls-auth /etc/openvpn/key/ta 0

push "persist-key"
push "persist-tun"

#плагин для авторизации пользователей,
plugin /usr/lib/openvpn/openvpn-auth-ldap.so "/etc/openvpn/openvpn.ldap"
log-append              log/openvpn.log
status                  log/openvpn-status.log
duplicate-cn

tun-mtu 1500
mssfix 1440

keepalive 10 40
persist-tun
persist-key
verb 4
reneg-sec 900
comp-lzo
client-to-client

Плагин для авторизации который идет с пакетом openvpn-auth-ldap не подойдет так как работает нормально только с tun интерфейсом
вот тут можно взять исходник
http://code.google.com/p/openvpn-auth-ldap/downloads/list
наложить на него вот этот патч
http://code.google.com/p/openvpn-auth-ldap/issues/detail?id=4&q=TAP
и скорее всего в процессе компиляции будут проблемы. нужен будет дополнительный пакет
http://code.google.com/p/openvpn-auth-ldap/issues/detail?id=6

описываем интерфейс
/etc/network/interfaces

auto tap_vpn
iface tap_vpn inet static
    address 172.224.0.1
    netmask 255.255.254.0
    pre-up openvpn --dev tap_vpn --mktun
Сетка такая большая ибо планируется большое количество клиентов.
Такая настройка интерфейса в результате даст вам ошибки при его перезапуску если мне память не изменяет. будет ругаться на то что интерфейс уже создан. руки не дошли написать скрипт для нормального перезапуска. но так как особой нужны в перезапуске последнего не было. я так сказать забил.

далее dhcp


ignore client-updates;
ddns-update-style interim;
option ms-classless-static-routes code 249 = array of unsigned integer 8;
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 172.224.0.0 netmask 255.255.254.0 {
        ddns-domainname "openvpn.domain.local";
        authoritative;
        option domain-search "vash_domen.local";
        option domain-name-servers 192.168.0.99 , 8.8.8.8;
        option domain-name "vash_domen.local";
        ddns-updates on;
        range 172.224.0.2 172.224.1.254;
        ddns-rev-domainname "in-addr.arpa.";
## строки ниже описывают маршруты проталкивающиеся клиенту, таким образом можно протолкнуть кажется до 30 маршрутов.
        option ms-classless-static-routes 24 , 10 , 0 , 0 , 172 , 224 , 0 , 1 , 24 , 192 , 168 , 0 , 172 , 224 , 0 , 1 ;
        option rfc3442-classless-static-routes 24 , 10 , 0 , 0 , 172 , 224 , 0 , 1 , 24 , 192 , 168 , 0 , 172 , 224 , 0 , 1 ;
        }
key dhcp {
        secret Xz7wSDkljfhdskfjV7ng==;
        algorithm hmac-md5;
        }
zone openvpn.domain.local. {
        primary 127.0.0.1;
        key dhcp;
                }
zone 0.224.172.in-addr.arpa. {
        primary 127.0.0.1;
        key dhcp;
        }
zone 1.224.172.in-addr.arpa. {
        primary 127.0.0.1;
        key dhcp;
        }

в /etc/default/dhcp3-server незабываем указать интерфейс который необходимо слушать

INTERFACES=tap_vpn

не забываем настроить bind.
процесс описывать не буду, так как через webmin это все делается весьма просто и быстро
от себя добавлю. не забывайте добавить разрешение динамического обновления зоны по ключу
allow-update {
                key dhcp;
                };

так же не забывайте прописать это же ключ в /etc/bind/named.conf

key dhcp {
        algorithm hmac-md5;
        secret "Xz7wSDkljfhdskfjV7ng==";
        };
и настроить rndc


Заключение.
Если желающие написать нормальный how-to я буду только рад, я к сожалению не обладаю достаточным количеством времени.
Будут проблемы, задавайте вопросы.
Я не стал описывать детально абсолютно все, так как если вы решитесь сделать конфигурацию вышеописанную мной, скорее всего вы не раз реализуете более простые схемы работы openvpn, dhcp и bind.
Но опять же, если кто то будет готов написать нормальный how-to я готов помочь ответами.



Оффлайн AlekSher

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #9 : 19 Май 2012, 18:23:47 »
Немного дполнений  :)
Со стороны сервера
comp-lzo adaptive # Сжатие трафика будет определяться конфигом клиента.
client-config-dir /etc/openvpn/client-config-dir # Индивидуальные настройки для каждого клиента.

Со стороны клиента
pull # Принимать все push от сервера.

Оффлайн snwbrdr

  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #10 : 19 Май 2012, 18:50:53 »
Немного дполнений  :)
Со стороны сервера


client-config-dir /etc/openvpn/client-config-dir # Индивидуальные настройки для каждого клиента.



этот параметр работать не будет, так как используется один ключ для всех.

Оффлайн AlekSher

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #11 : 19 Май 2012, 19:35:36 »

этот параметр работать не будет, так как используется один ключ для всех.


Работать он будет, несмотря на ругать сервера, просто смысл его исчезнет.

А так, да или client-config-dir, или duplicate-cn

Оффлайн snwbrdr

  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #12 : 19 Май 2012, 20:40:47 »
ну без duplicate-cn это вообще будет все жестко посылать всех

Оффлайн artem.ultra

  • Участник
  • *
  • Сообщений: 226
    • Просмотр профиля
    • Sa-iT
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #13 : 20 Май 2012, 22:28:39 »
на сколько я помню, то на tap интерфейсе ip адреса выдаются автоматически. скажем так, средствами openvpn
или у вас как то по другому?

Оффлайн snwbrdr

  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: [HOWTO] OpenVPN + SSL/TLS
« Ответ #14 : 21 Май 2012, 08:52:12 »
Да, адреса раздаются dhcp сервером

 

Страница сгенерирована за 0.15 секунд. Запросов: 23.