OVPN (OpenVPN) своими руками

Поделиться ВКонтакте
+1

В самом начале этого блога я писал, как обходить блокировки, но та инструкция немного устарела. Полагаю, пришла пора ее обновить, и я решил сделать это не в изначальном посте, а написать новый, исходя из текущих реалий. На выходе вы получите свой работающий OVPN (OpenVPN), подключающийся по одному клику. Итак, поехали…

Отмазка: подразумевается, что у вас уже есть сервер с Ubuntu на борту, если нет — заведите (чтобы это сделать есть две ссылки справа, одна на Linode, вторая на DigitalOcean). По опыту не все читатели понимают очевидные вещи, поэтому писать буду подробно.

#1: Установим и настроим OpenVPN сервер и его окружение

Обновимся…

Теперь установим OpenVPN и Easy-RSA…

Конфиг по дефолту должен быть распакован в /etc/openvpn, поэтому делаем так…

Теперь надо открыть файл server.conf и отредактировать его…

В этот файлик необходимо внести некоторые изменения. Найдите секцию файла, которая выглядит примерно так:

Замените dh1024.pem на dh2048.pem — это удвоит длину ключа RSA при генерации ключей сервера и клиента. Теперь вам надо найти вот эту секцию файла:

Раскомментируйте строку push “redirect-gateway def1 bypass-dhcp”, чтобы VPN-сервер отправлял клиентский трафик (то есть ваш) куда следует… В итоге, эта строка должна выглядеть так:

Далее ищем вот такую секцию:

Аналогично, нужно раскомментировать строки push “dhcp-option DNS 208.67.222.222” и push “dhcp-option DNS 208.67.220.220”. В итоге, они должны выглядеть так:

Эта опция указывает клиенту на необходимость использования сторонних DNS-серверов, это может помочь избежать утечек данных при работе с соединением. Можете заменить прописанные IP-адреса DNS-серверов на 8.8.8.8 и 8.8.4.4, а можете оставить те, которые есть (OpenDNS). С DNS разобрались, ищем теперь вот это:

Раскомментируем строки user nobody и group nogroup, чтобы получилось так:

По умолчанию OpenVPN работает от рута и имеет полный доступ к машине — на мой взгляд это не есть правильно, поэтому мы только что сконфигурировали его работать от юзера nobody с группой nogroup. Это юзер без каких-либо привиллегий, обычно зарезервированный системой для работы недоверенных приложений. Теперь можно сохранить файл и выйти.

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

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

Почти в самому верху файла вы должны увидеть такие строки:

Раскомментируйте строку net.ipv4.ip_forward, в итоге она должна выглядеть вот так:

Теперь можно сохранить этот файл и выйти. В Ubuntu, начиная с версии 14.04 есть такая штука — называется Uncomplicated Firewall (ufw), он нам понадобится. ufw это фронтенд для iptables, настроить его легко, нужно просто создать несколько правил и поправить конфиги, а затем включать файрвол. Поехали…

Мы будем настраивать OpenVPN на работу по протоколу UDP, поэтому ufw должен разрешать UDP-трафик через порт 1194.

Также, для самого ufw нужно задать правило перенаправления пакетов, откроем конфиг:

Ищем строку DEFAULT_FORWARD_POLICY=”DROP”. Ее значение нужно изменить с DROP на ACCEPT, чтобы в итоге получилось вот так:

Теперь надо добавить несколько дополнительных правил для ufw, чтобы включить NAT и маскарадинг для подключенных клиентов:

Сразу после этой секции:

Надо добавить:

Теперь можно сохранить файлик и выйти. Затем, включаем ufw:

ufw может спросить:

Скажем, что да и нажмем энтер:

Если все было сделано правильно — напишет:

Можно проверить его статус (не обязательно):

Ответит, скорее всего, как-то так:

На этом настройка OpenVPN сервера и файрвола завершена, едем дальше ;-)

#2: Создадим сертификаты и ключи

OpenVPN использует сертификаты для того чтобы шифровать трафик между клиентом и сервером.

Настроим Certificate Authority (CA) и сгенерируем сертификат и ключ для OpenVPN сервера. OpenVPN поддерживает двухстороннюю авторизацию, основанную на сертификатах. Это означает, что клиент должен авторизовать сертификат сервера и сервер должен авторизовать сертификат клиента прежде чем взаимное доверительное соединение будет установлено. Для этой цели будем использовать скрипты Easy RSA, которые мы скопировали ранее. Поехали:

Создадим директорию для хранения ключей:

У Easy RSA есть файлик с переменными, который мы можем отредактировать (а можем и не трогать, это опционально), для того чтобы создавать сертификаты эксклюзивно для себя, своего бизнеса, и так далее. Эта информация копируется в сертификаты и ключи, и помогает идентифицировать ключи позднее. Откроем файл:

В этой секции:

Можете редактировать все, что находится в кавычках, вписывая ваши данные (по желанию). В том же файле, проследите, чтобы строка выглядела так:

Теперь надо сгенерить параметры Diffie-Hellman, это займет несколько минут (в зависимости от мощности сервера):

Сменим рабочую директорию:

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

Ответ должен быть таким:

Теперь очистим рабочую директорию от любых возможных старых (или демо) ключей:

Почти финал… Осталось сделать билд CA, в процессе спросят о данных — можно либо их вводить, либо оставить дефолтные (нажимая энтер), это не принципиально:

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

Спросит:

Ответим, что да:

Если все было ок — скажет так:

Теперь надо переместить серверные сертификаты и ключи:

Для того, чтобы проверить, были ли они корректно скопированы:

На этом вроде бы все, можно запускать:

Должно сказать:

На этом настройка сервера завершена. Теперь, нам нужно сгенерить сертификаты и ключи для клиента:

Как обычно, все это можно не заполнять, везде жмем энтер:

Далее будет два запроса:

На оба отвечаем да:

Если нигде не ошиблись, то должно быть так:

Далее:

Все. Теперь вам надо зайти на сервер через sftp и забрать следующие файлы к себе на клиентский компьютер:

  • ca.crt
  • client1.crt
  • client1.key

#3: Настроим клиентский компьютер

Я советую платный софт, который называется Viscosity. Стоит всего $9, и он действительно стоит этих денег — не жалейте, покупайте. Есть версии и под винду, и под мак. Лицензия не взаимозаменяема. Скриншоты приводить не стану — там все просто, разберетесь. Нужно создать новое соединение, во вкладке “Аутентификация” выбрать тип “SSL/TLS Client” и скормить ему файлы, которые вы загрузили ранее. Затем там же вкладка “Сеть”, нужно отметить (включить) пункт “Отправлять весь трафик через VPN”. Все.

Если будут какие-либо вопросы — с радостью отвечу на них в комментариях.


Я советую хостинг Linode и Digital Ocean. Рефам помощь в установке и настройке — бесплатно!

  • Pingback: ФЗ-187: Наиболее правильный обход блокировок — TheWired()

  • Pingback: Насколько безопасен OpenVPN — TheWired()

  • Pingback: Как избежать утечки трафика при использовании OpenVPN на Android — TheWired()

  • Stas Poz

    Ну что сказать…
    Ты просто кросавчег!!!
    Первый faq на эту тему разжованый от и до!
    Получилось с первого раза.
    Была только проблема с пересылкой файлов с сервера на локальную машину.
    Добавь. Файл client1.key нужно отредактировать через chmod, иначе его забрать с сервера неполучится… Хотя х.з. как ты делал

  • andrei lapshin

    Прекрасный материал! Спасибо большущее именно за настройку сервера. Все вышло 1 в 1.
    Только вот сама схема применения нежизнеспособна…
    Вот если бы еще допилить материал как еще настроить ubuntu-server в виде клиентов, чтобы маршрутизировалось все-ко-всем через центральный ubuntu-server настроенный именно как сервер, как и написано в статье – золотой материал бы получился. Плюсы – расходуется только 1 публичный айпишник, так как клиенты подсоединяются из-за NAT и распределенная сеть центральный офис – филиалы с нулевой затратной частью. Да.., было бы золото, а так только серебро.

    • Андрей, статья зависит от того, какую задачу надо с использованием статьи закрыть. В данном случае — речь шла об обходе блокировок, и об обеспечении безопасности клиента в публичных (и не только) местах. Эту задачу статья закрывает на все 100%. Если логика ваших потребностей несколько иная, это не значит, что эта статья “серебро”, это значит, что для ваших потребностей надо писать отдельную статью, которая точно так же как и эта станет “золотом”)

      • andrei lapshin

        Ну вот, поблагодаришь человека..))

        Для “обхода блокировок”, если правильно понимаю о чем речь (если неправильно, тогда “миль пардон”), не проще ли использовать Tor Brauser (https://ru.wikipedia.org/wiki/Tor), чем городить огород из выделенного сервера?

        Ладно, согласен, вопрос религии… Не будем углубляться..))

        А вот вопрос по-существу:

        в /etc/openvpn/server.conf параметр daemon нужен? Вроде бы бы и без него запускается все автоматом?

        • Нет, не проще. Потому что exit-nodes в Торе под прицелом ;) А частные сервера, коих сотни, особенно виртуалок — не особо ;) Так что твой трафик это твой трафик, а тор не надо ;)

          Что касается вопроса по существу. Сам спросил, сам ответил.

          • andrei lapshin

            В любом случае статья очень помогла. Денег, здоровья тебе, добрый человек. Ну и конечно обойти все блокировки и чтоб не поймали))

          • Рад, что статья помогла. Что касается “чтоб не поймали”, я ни от кого особо не скрываюсь ;-)

  • Ярослав Новиков

    Добрый вечер, абсолютно не разбираясь во все этом про принципу- скопировал, вставил, проверил-все получилось (в том числе и comodo и что бы на 2ip не понимали)). Спасибо. Захожу сегодня на джойказино (впервые), а меня туда не пускает мой интернет провайдер. Не знаю зачем начал лазить копаться в инете в клиенте, но пока копошился появилось еще несколько вопросов.
    1. Почему блокирует провайдер?, нарыл что как то связано с DNS. Есть ли решение?
    2. Это пишет Viscosity при подключении к серверу (WARNING), ответа под свой ум не нашел:
    ноя 11 17:08:22: Состояние изменено на Creating…
    ноя 11 17:08:24: Состояние изменено на Disconnected
    ноя 11 17:08:35: Состояние изменено на Connecting
    ноя 11 17:08:35: Viscosity Windows 1.6.6 (1461)
    ноя 11 17:08:35: Выполняется на Майкрософт Windows 10 Домашняя для одного языка
    ноя 11 17:08:35: Включаем интерфейс…
    ноя 11 17:08:35: Проверка доступности соединения…
    ноя 11 17:08:35: Соединение доступно. Подключаюсь.
    ноя 11 17:08:35: OpenVPN 2.3.12 Windows-MSVC [SSL (OpenSSL)] [LZO] [PKCS11] [IPv6] built on Aug 24 2016
    ноя 11 17:08:35: library versions: OpenSSL 1.0.2h 3 May 2016, LZO 2.09
    ноя 11 17:08:36: WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.
    ноя 11 17:08:36: UDPv4 link local: [undef]
    ноя 11 17:08:36: UDPv4 link remote: [AF_INET]XX.XX.XX.XXX:1194
    ноя 11 17:08:37: WARNING: this cipher’s block size is less than 128 bit (64 bit). Consider using a –cipher with a larger block size.
    ноя 11 17:08:37: WARNING: this cipher’s block size is less than 128 bit (64 bit). Consider using a –cipher with a larger block size.
    ноя 11 17:08:37: [server] Peer Connection Initiated with [AF_INET]XX.XX.XX.XXX:1194
    ноя 11 17:08:40: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
    ноя 11 17:08:40: open_tun, tt->ipv6=0
    ноя 11 17:08:40: TAP-WIN32 device [Соединение] opened: \.Global{9404DDCE-9E65-4A19-AB06-53C11C49D25D}.tap
    ноя 11 17:08:40: Notified TAP-Windows driver to set a DHCP IP/netmask of 10.8.0.6/255.255.255.252 on interface {9404DDCE-9E65-4A19-AB06-53C11C49D25D} [DHCP-serv: 10.8.0.5, lease-time: 31536000]
    ноя 11 17:08:40: Successful ARP Flush on interface [11] {9404DDCE-9E65-4A19-AB06-53C11C49D25D}
    ноя 11 17:08:45: Initialization Sequence Completed
    ноя 11 17:08:45: Используется режим Full DNS
    ноя 11 17:08:45: Состояние изменено на Connected