- Развертывание VPN сети на основе OpenVPN от А до Я
- Введение
- Задача
- Эскиз сети
- Настраиваем сервер
- Настройка учетных записей клиентов
- Настройка клиентов
- Диагностика и устранение неполадок
- Послесловие
- Настройка OpenVPN вручную
- Установка необходимого ПО
- Настройка центра сертификации
- Настройка сервиса OpenVPN
- Настройка сетевой конфигурации сервера
- Включение сервиса OpenVPN
- Создание конфигураций клиентов
- Создание базовой конфигурации
- Скрипт для генерации конфигов
- Создание конфигураций
- Настройка клиентов
- Windows
- MacOS
Развертывание VPN сети на основе OpenVPN от А до Я
Введение
Задача
Наверно нет смысла рассказывать для чего используются VPN. Я приведу реальную задачу и расскажу как ее достичь.
Основная задача — это безопасное и простое решение доступа к внутренним ресурсам моих серверов.
Первый сервер является «домашним» серверов, подключенный к широкополосному соединению в городе под управлением CentOS 5.5, выполняющий различные функции, в том числе шлюза для квартирной сети. Назовем его CITY. Квартирная сеть использует адреса 192.168.22.0/24 и 192.168.21.0/24.
Второй сервер установлен на дальнем объекте, например, за городом на даче. Сервер работает под управлением CentOS 5.5 и выполняет функции шлюза для дачной сети и тоже выполняет другие задачи. Доступ в сеть осуществляется с помощью недорогого доступа по технологии 3G — в сервер воткнут USB 3g-модем и настроено устойчивое соединение. Назовем его CAMP. Дачная сеть использует адреса 192.168.23.0/24 и адреса 192.168.24.0/24.
А еще у меня есть ноутбук под управлением Windows XP, который вместе с владельцем попадает в разные сети, в том числе из дома, с работы и прочих гостевых мест, где есть доступ в Интернет. Назовем его NOTEBOOK.
Я хочу иметь доступ с ноутбука на мой домашний сервер CITY, в том числе к файлопомойке по NetBIOS и пр. А еще я хочу иметь доступ на сервер CAMP.
В случае CITY некоторые проблемы доступа можно решить публичным IP адресом. Но для CAMP публичный IP адрес у мобильных операторов практически недоступен или стоит неоправданно дорого для частного использования. А обычные клиенты работают через NAT. На ноутбуке проблемы сходные — как правило, везде NAT, бывают публичные открытые сети, где весь трафик виден всем пользователям.
Решением этих проблем является использование OpenVPN для связи всех компьютеров в единую сеть, заодно, защищенную от посторонних глаз.
Эскиз сети
CITY всегда включен и имеет внешний IP адрес, допустим 22.33.44.55, находится на широком и устойчивом канале, поэтому он будет сервером VPN.
А CAMP и NOTEBOOK клиентами VPN.
Сеть с адресами 192.168.25.0/24 выделяем под VPN.
Мы разрешим роутинг, чтобы видить все нужные сети.
Настраиваем сервер
Итак шаги для настройки сервера на базе СentOS, впрочем они легко применимы и для FedoraProject и собственно RedHat Enterprise Linux и прочим RPM based дистрибутивам, ну а с небольшими изменениями вполне должны работать по Debian/Ubuntu.
На всякий случай, выключите репозиторий rpmforge, т.к. в нем openvpn собран с неверными путями. Я использую репозиторий epel для установки OpenVPN.
Ставим openvpn:
переходим в рабочий каталог
Настраиваем параметры сервера (необязательно):
Инициализируем переменные окружения, для последующего запуска скриптов:
Очищаем все на всякий случай:
Создаем сертификат CA
Создаем сертификат X.509
Создаем ключ Диффи-Хеллмана
Создаем ta.key (TLS сертификат)
Настраиваем конфигурацию сервера:
Вот такой конфиг файл я использую:
В этом варианте я использую файлы ключей и сертификатов по тем путям, где они реально находятся.
На время отладки оставляем уровень детализации журналов verb 5, затем его можно переключить на verb 1. Это надо сделать обязательно. Максимальный размер журнала — 2 Гб. При достижении этого лимита OpenVPN прекратит работу. Поэтому нужно уменьшить детализацию журналирования и настроить ротацию журнала средствами ОС — logrotate.
log-append перенастроен на нормальное место для записи логов сервера.
client-to-client разрешает трафик между клиентами.
Параметр client-config-dir указывает, где хранятся настройки подключения для каждого клиента. Создаем каталог /etc/openvpn/ccd
В принципе сервер настроен, можно его перезапустить:
Не забудьте прописать автоматический запуск сервиса при перезагрузке системы.
А еще надо настроить firewall для разрешения трафика OpenVPN. Я использую исторически скрипт /etc/rc.d/rc.firewall, который настраивает все цепочки, так как мне надо. Поэтому команды мои выглядят примерно так:
для идеологически правильного /etc/sysconfig/iptables строчка будут выглядить примерно так:
Через интерфейс настройки firewall команды setup нужно добавить в список портов через пробел строчку:
Для разрешения трафика между клиентами я использую команду:
а для разрешения трафика между подсетями:
В общем, у нас сервер окончательно настроен. Проверяем.
Наличие процесса:
и обязательно должен присутствовать интерфейс tun0, если других VPN не запущено.
Настройка учетных записей клиентов
Для генерации и подписывания сертификатов используются два скрипта:
— для создания сертификата с паролем и
— для сертификата без пароля.
В первом случае для использования сертификата придется каждый раз вводить пароль, для пользователей, такой способ обеспечивает снижение рисков в случае попадания ноутбука в чужие руки. Для автоматического входа в сеть, сертификат нужно создавать без пароля.
Создаем аккаунт для ноутбука:
заходим в каталог
инициализируем окружение командой:
генерируем ключ для пользователя notebook с паролем:
в подкаталоге ./keys появится комплект файлов для авторизации.
А еще для клиента нужно настроить параметры сети, которые находятся в файлах с именем клиента /etc/openvpn/ccd/, в данном случае нужно редактировать файл notebook:
В этом файле мы указываем адрес и другие сетевые параметры.
Самое главное — назначим адрес для клиента в нашей VPN подсети.
Дла совместимости со стеком TCP/IP Windows адреса клиентам назначаются с интервалом 4, фактически на каждого клиента выделяется подсеть с маской /30: адрес сети, адрес клиента, адрес шлюза, широковещательный адрес.
Вот здесь указан список возможных адресов
http://openvpn.net/index.php/open-source/documentation/howto.html#policy
Первая пара у нас занята адресом самого сервера. Выделяем адреса .5 и .6:
В моем случае, у меня есть свой DNS сервер по адресу 192.168.22.1, он обслуживает локальную DNS зону mynetwork, для настройки я добавлю в файл две строки:
— укажем клиенту какой использовать DNS сервер
— укажем зону по умолчанию для поиска имен DNS.
Поскольку мой сервер CITY имеет две подсети 192.168.22.0/24 и 192.168.21.0/24 и я хочу чтобы клиент мог их видеть, то нужно настроить маршруты, добавляем две строчки:
Теперь тоже самое делаю для клиента CAMP:
заходим в каталог
инициализируем окружение командой:
генерируем ключ для пользователя camp с паролем:
Настраиваем параметры сетевого доступа:
Итак, настроен сервер, созданы две учетные записи для клиентов camp и notebook.
При подключении camp получит адрес 192.168.25.9, а notebook 192.168.25.5
Теперь дело за настройкой клиентов.
Настройка клиентов
Для работы клиентов из каталога
/usr/share/openvpn/easy-rsa/2.0/keys/
забираем следующие файлы:
ca.crt — сертификат сервера
ta.key — tls сертификат
%username%.crt — персональный сертификат
%username%.key — персональный ключ
Настройка клиента под Windows XP на NOTEBOOK
Ставим openvpn вместе с GUI:
http://www.openvpn.net/index.php/open-source/downloads.html
например:
http://swupdate.openvpn.net/community/releases/openvpn-2.2-beta5-install.exe
Надо перегрузить систему, чтобы завершить установку VPN интерфейса.
Копируем клиентские файлы в каталог «C:\Program Files\OpenVPN\config\»
В данном случае, это:
ca.crt
ta.key
notebook.crt
notebook.key
Создаем файл конфигурации клиента notebook.ovpn:
В этом файл выключена запись в файл журнала, в противном случае OpenVPN-GUI не сможет контролировать работу клиента.
Если мы создали сертификат с паролем — нам придется устанавливать соединение всегда руками, т.к. потребуется ввод пароля:
1. Запускаем GUI.
2. В контекстном меню увидим пункт notebook, выбираем connect. Появляется окно журнал работы и запрос пароля на сертификат.
Если используем сертификат без пароля, можно использовать службу OpenVPN:
1. Запускаем services.msc
2. Находим OpenVPN service и ставим автоматический запуск и запускаем службу.
В обоих случаях при успехе — соединение установится, красные цвета иконки OpenVPN-GUI поменяют на зеленые. Будет присвоен адрес 192.168.25.5
Настройка клиента под CentOS на сервере CAMP
забираем клиентские файлы в каталог /etc/openvpn/:
Разрешаем соединение в firewall. Само главное — обратные пакеты UDP пустить:
Я делаю так в своем любимом /etc/rc.d/rc.firewall:
В принципе, клиент настроен, можно его перезапустить:
Не забываем обеспечить автостарт сервиса при перезагрузке.
Если все в порядке — появится интерфейс tun0, ему будет присвоен адрес 192.168.25.9
Наша VPN сеть запущена. Командой ping и доступом к известным сервисам проверяем работоспособность сети.
Диагностика и устранение неполадок
Основные средства проверки работы — это ping и tcpdump. Большинство ошибок выявляются этими командами.
Например, командой
я могу прослушать трафик сервера и убедиться, что сервер видит пакеты и отвечает на них.
Судя по ошибкам — Адаптер VPN не работает под Windows.
Если установлен OpenVPN для Windows, но систему еще не перегружали — Перегрузите систему после установки OpenVPN.
При установке соединения выводится ошибка про журнал.
Если включено ведение журнала в файл, то OpenVPN-GUI может иметь проблемы при поднятии соединения, особенно на этапе запроса пароля. Помогает выключение ведения журнала и высокой детализации, нужно открыть *.ovpn файл и закомментировать две строчки (они в конце) вот так:
Нет соединения.
Со стороны клиента нужно сделать пинг на адрес сервера — ping 22.33.44.55. Если не отвечает — устранить причину.
Под Windows убедиться, что openvpn.exe, openvpn-gui.exe и openvpnserv.exe не заблокирован персональным фаерволом или антивирусом.
Просмотреть ошибки в консоли и логе openvpn.log и погуглить их
Соединение не устанавливается — пакет пришел не «с того адреса».
Сопровождается ошибками:
Incoming packet rejected from . expected peer address…
Такое возможно если клиент находится «рядом» с сервером — пакеты посылаются на один адрес (внешний), а ответы приходят со внутреннего адреса. По умолчанию OpenVPN считает такую конфигурацию небезопасной и блокирует работу. Опция float устраняет проблему.
Соединение есть, но туннель не работает.
1. Убедиться, что персональный firewall не блокирует трафик для подсети 192.168.25.*
2. Что присутствуют маршруты во внутренние подсети — команда в Windows: route print.
3. В случае Vista/W7 не забыть запускать клиента с правами Администратора, иначе не поднимаются маршруты!
В остальных случаях помогает увеличение детализации вывода опцией verb и внимательное штудирование openvpn.log
Послесловие
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.
Настройка OpenVPN вручную
Прежде чем приступать к настройке VPN вручную, рекомендуем попробовать более простой способ настройки: через интерфейс Webmin. Инструкция.
Если вам необходимо настроить удаленное подключение к рабочим серверам (например, при организации удаленной работы для сотрудников, чтобы обеспечить им доступ к корпоративной сети и внутренним ресурсам из сторонних сетей), вы можете воспользоваться этой инструкцией для настройки VPN-подключения и удаленного доступа.
Существует множество вариантов реализации VPN. Ниже мы рассмотрим настройку на основе OpenVPN.
Для настройки нам понадобится VDS с установленной Ubuntu 16.04.
Обратите внимание, что сервер, на котором будет запущен клиент VPN для пропуска во внутреннюю сеть, должен являться шлюзом сети. Также, файрвол должен быть настроен на пропуск пакетов через VPN.
Установка необходимого ПО
Подключитесь к серверу по SSH и выполните установку OpenVPN и центра сертификации командами:
Настройка центра сертификации
OpenVPN использует TLS/SSL, поэтому вам потребуются сертификаты для шифрования трафика между сервером и клиентами. Для выпуска доверенных сертификатов необходимо создать свой собственный центр сертификации.
1. С помощью команд ниже скопируйте шаблонную директорию easy-rsa в домашний каталог и перейдите в созданную директорию:
2. Отредактируйте файл vars :
Необходимо отредактировать несколько переменных, которые задают параметры сертификатов. Эти переменные: KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL, KEY_OU. Укажите значения для каждой из них, не оставляйте их незаполненными.
Также нужно отредактировать значение переменной KEY_NAME, указав субъекта сертификатов. В примере мы зададим ему имя сервер Server (вы можете указать свое), это же значение будет использоваться далее в командах в инструкции.
Сохраните и закройте файл.
3. Создайте центр сертификации при помощи утилиты easy-rsa и заданных переменных. Выполните команду:
Вывод должен быть следующим:
Выполните предложенную команду, чтобы удостовериться, что вы работаете в «чистой среде»:
Создайте корневой центр сертификации:
Запустится процесс создания ключа и сертификата корневого центра сертификации. Все необходимые значения будут введены автоматически, так как вы задали их в файле vars. Нажимайте ENTER для подтверждения выбора.
Настройка центра сертификации закончена.
4. Создайте сертификат и пару ключей, а также дополнительные файлы, используемые для шифрования.
Обратите внимание: далее в командах и примерах мы будем использовать Server — значение, указанное выше для переменной KEY_NAME. Если вы указали другое имя, не забудьте заменить его в приводимых командах. Это будет касаться, в том числе, имени файла конфигурации: в нашем случае это будет /etc/openvpn/server.conf .
4.1. Создайте сертификат OpenVPN и ключи для сервера:
Подтвердите все значения по умолчанию, нажимая Enter. Не задавайте challenge password. При завершении процесса два раза введите y для подписи и подтверждения создания сертификата:
4.2. Создайте оставшиеся файлы. Сгенерируйте надежные ключи протокола Диффи-Хеллмана:
4.3. После завершения процесса сгенерируйте подпись HMAC:
Настройка сервиса OpenVPN
1. Скопируйте созданные файлы (сертификат и ключ центра сертификации, сертификат и ключ сервера, подпись HMAC и файл Diffie-Hellman) в директорию /etc/openvpn :
2. Скопируйте и распакуйте файл c примером конфигурации OpenVPN в конфигурационную директорию. Этот файл послужит основой для последующих настроек.
3. Настройте конфигурационный файл сервера. Откройте файл /etc/openvpn/server.conf :
3.1. Найдите директиву tls-auth. Удалите «;«, чтобы раскомментировать строку. Далее добавьте параметр key-direction и установите его значение в 0.
Должно получиться следующее:
3.2. Найдите секцию шифрования с закомментированными строками cipher. Удалите «;» для раскомментирования строки со значением AES-128-CBC, под этой строкой добавьте строку auth и укажите алгоритм HMAC, например, SHA256:
3.3. Найдите настройки user и group и удалите «;» для раскомментирования этих строк:
3.4. Для реализации доступа к сети, которая находится за клиентом (внутренняя сеть) необходимо прописать следующие строки, где ip 192.168.33.0 следует заменить на ip необходимой внутренней сети:
3.5. Проверьте настройки cert и key, чтобы они указывали на правильные файлы .crt и .key, которые вы скопировали ранее в /etc/openvpn :
Сохраните и закройте файл.
4. Для реализации доступа к внутренней сети, которая находится за клиентом, выполните следующее.
4.1. Создайте директорию /etc/openvpn/ccd :
4.2. Создайте новый файл, название которого должно совпадать с названием конфига клиента, который будет запущен на соответствующем сервере:
4.3. Добавьте в него необходимые ip c масками для пропуска клиентов во внутренние сети:
4.4. Сохраните и закройте файл.
4.5. Задайте необходимые права для файла:
Настройка сетевой конфигурации сервера
1. Разрешите серверу перенаправлять трафик:
2. Примените настройки к текущей сессии:
3. Отключите правила файрвола. При необходимости вы сможете настроить правила самостоятельно, используя материал в Сети.
Включение сервиса OpenVPN
Запустите сервер OpenVPN, указав имя файла конфигурации в качестве переменной. В нашем случае файл конфигурации называется /etc/openvpn/server.conf , поэтому мы используем @server . Укажите здесь корректное для вас значение.
Проверить статус можно командой:
Вы также можете проверить доступность интерфейса OpenVPN tun0 командой:
Если всё в порядке, добавьте сервис в автозагрузку:
Создание конфигураций клиентов
Создание базовой конфигурации
1. В домашней директории создайте каталог для хранения файлов:
2. Скопируйте файл с примером конфигурации в этот каталог:
3. Откройте этот файл в текстовом редакторе и внесите изменения:
3.1. Найдите директиву remote , которая сообщает клиенту адрес сервера OpenVPN. Укажите здесь IP-адрес вашего VDS-сервера:
3.2. Раскомментируйте директивы user и group, удаляя “;”:
3.3. Найдите директивы ca, cert и key и закомментируйте их, добавив #:
3.4. Добавьте настройки cipher и auth с такими же значениями, как в файле /etc/openvpn/server.conf , а также директиву key-direction со значением 1.
3.5. Добавьте следующие закомментированные строки, которые будут необходимы для клиентов на Linux, использующих файл /etc/openvpn/update-resolv-conf. Для таких клиентов потребуется раскомментировать эти строки в сгенерированном клиентском файле конфигурации OpenVPN.
Сохраните и закройте файл.
Скрипт для генерации конфигов
Далее необходимо создать скрипт, который будет генерировать файлы конфигурации с сертификатами, ключами и файлами шифрования и размещать их в директории
1. Создайте и откройте файл make_config.sh внутри директории
2. Вставьте в него следующий блок директив:
3. Сохраните и закройте файл.
4. Сделайте его исполняемым:
Создание конфигураций
Ниже мы рассмотрим создание сертификата для сервера, имеющего доступ во внутреннюю сеть. Аналогичным образом вы сможете создать сертификаты для любого количества клиентов, каждый раз передавая скрипту уникальное значение.
Для создания первого сертификата и ключа мы будем использовать параметр cserver1.
Для создания файлов без пароля (это облегчит автоматические соединения), используйте команду build-key:
В процессе создания файлов нажимайте Enter для подтверждения (все необходимые значения уже введены). Не задавайте challenge password. При завершении процесса дважды укажите y в ответ на запросы о подписи и подтверждении создания сертификата.
Сгенерируйте конфигурацию для этих файлов. Для этого перейдите в директорию
/client-configs и воспользуйтесь созданным скриптом:
Если всё прошло успешно, в директории
/client-configs/files будет создан файл cserver1.ovpn :
Этот файл необходимо передать соответствующему клиенту. Скачать конфигурацию можно по SFTP.
Настройка клиентов
Инструкции по настройке клиентов для OpenVPN для разных устройств и систем вы можете найти в сети. В большинстве случаев достаточно установить клиент и импортировать файл конфигурации.
Для примера, ниже рассмотрим настройку клиентов на компьютере с системами Windows и MacOS.
Windows
- Загрузите клиент с сайта OpenVPN: https://openvpn.net/community-downloads/ и установите его на компьютер.
- После установки скопируйте полученный файл конфигурации в папку C:\Program Files\OpenVPN\config .
- Запустите OpenVPN. Это необходимо сделать от имени администратора: кликните на значке правой кнопкой и выберите «Запуск от имени администратора». Чтобы OpenVPN всегда по умолчанию запускался от имени администратора, кликните на его значке правой кнопкой и выберите Свойства. На вкладке «Совместимость» отметьте пункт «Выполнять эту программу от имени администратора» и сохраните.
- В появившемся при запуске окне с предупреждением (разрешить программе внести изменения) нажмите «Да.»
- Кликните правой кнопкой мыши на значке OpenVPN в трее, выберите загруженный профиль и нажмите Connect / Подключиться.
Откроется окно с логом соединения, и, как только соединение будет установлено, появится соответствующее уведомление.
Для отключения снова кликните на значок OpenVPN в трее, выберите нужный профиль и нажмите Disconnect / Отключиться.
MacOS
- Для MacOS можно использовать бесплатный клиент Tunnelblick.
- Загрузите клиент с сайта Tunnelblick: https://tunnelblick.net/downloads.html
- Дважды кликните на загруженном файле и пройдите процесс установки.
- При завершении установки выберите «Нет» в ответ на вопрос о наличии конфигурационных файлов.
- После завершения установке откройте Finder и кликните дважды на вашем конфигурационном файле. Tunnelblick автоматически установит профиль.
Для установки соединения запустите Tunnelblick, после чего кликните на его иконку в верхней части экрана и нажмите Connect. Далее выберите установленный профиль.