Как сделать двойной vpn
Настройка «двойного» (double) OpenVPN
Часто пользователи сети Интернет по различным причинам не хотят показывать свой реальный IP, который выдает им провайдер. Известно, что многие организации предоставляют услуги VPN, Proxy, Socks, которые помогают пользователю сохранить свою анонимность в сети. Для чего это нужно отдельному пользователю — причин может быть множество, на этом мы не будем акцентировать внимание. Рассмотрим процесс создания OpenVPN-сервера, который соединен с другим OpenVPN-сервером, при этом трафик от пользователя идет через первый сервер, после этого на второй и далее уже к нужному ресурсу. Возвращается трафик по этой же цепочке в обратной последовательности. Много владельцев подобной схемы называют ее «double» (двойным) OpenVPN. Схематически такую схему можно отобразить таким образом:
Для создания подобной схемы необходимо наличие двух VPS/VDS (как правило, VDS используется при больших нагрузках (объемах передаваемого трафика)). При этом, если будет использоваться VPS с типом виртуализации OpenVZ или другим, при котором контейнеры виртуальных машин используют общее ядро хост-системы, необходимо уточнить у хостера, разрешена ли загрузка модуля tun для виртуальных машин.
Реализация схемы предполагает настройку соединения через OpenVPN между клиентом и OpenVPN-сервером 1, между двух OpenVPN-серверов, настройку NAT на OpenVPN-сервере 2 и настройку маршрутизации на двух OpenVPN-серверах.
Устанавливаем на обеих серверах OpenVPN. Приведем, например, процесс установки для ОС CentOS. В стандартных репозиториях CentOS пакет openvpn отсутствует, поэтому подключаем нужные источники (учитываем версию и архитеркуту ОС)
Проверяем, загружен ли модуль tun
lsmod | grep tun
Если вывод предыдущей команды пустой, выполняем загрузку модуля tun
modprobe tun
Как организовать автоматическую загрузку OpenVPN и модуля tun при запуске системы зависит от конкретной ОС. Для создания соединения между двумя серверами используем настройку OpenVPN point-to-point. Для этого на OpenVPN-сервер 2 создаем конфигурационный файл /etc/openvpn/server.conf с таким содержимым:
dev tun
proto tcp-server
ifconfig 10.0.2.1 10.0.2.2
tls-server
comp-lzo
daemon
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
tls-auth /etc/openvpn/keys/tls.key 0
cipher AES-256-CBC
port 1195
user nobody
group nobody
max-clients 1
persist-key
persist-tun
verb 3
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
script-security 3 system
route-up «ip route add 10.0.1.0/24 via 10.0.2.2 dev tun0»
Ключи и сертификаты, которые размещены в /etc/openvpn/keys/ создаем согласно FAQ от разработчиков OpenVPN с использованием easy-rsa.
Содержимое команды route-up зависит от настройки клиентской сети и настроек соединения между серверами.
Включаем форвардинг пакетов. В файле /etc/sysctl.conf значение параметра net.ipv4.ip_forward меняем с 0 на 1
net.ipv4.ip_forward = 1
Загружаем переменные ядра из обновленного файла sysctl.conf
Также на втором сервере настраиваем NAT с помощью iptables:
где 1.1.1.1 — внешний IP сервера 2.
На первом сервере также устанавливаем OpenVPN и создаем конфигурационный файл /etc/openvpn/s2s.conf:
dev tun0
remote 1.1.1.1
port 1195
proto tcp-client
ifconfig 10.0.2.2 10.0.2.1
tls-client
comp-lzo
daemon
script-security 3 system
ns-cert-type server
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/s2s.crt
key /etc/openvpn/keys/s2s.key
dh /etc/openvpn/keys/dh1024.pem
tls-auth /etc/openvpn/keys/tls.key 1
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
verb 3
route-up «ip route add default via 10.0.2.1 dev tun0 table 10 && ip rule add from 10.0.1.0/24 lookup 10 pref 10»
mute 10
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
Также включаем форвардинг пакетов.
Настраиваем OpenVPN-сервер 1 для подключения клиентов. Для этого создаем конфигурационный файл /etc/openvpn/server.conf:
port 1194
local 2.2.2.2
proto tcp
dev tun1
server 10.0.1.0 255.255.255.0
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
tls-auth /etc/openvpn/keys/tls.key 0
cipher AES-256-CBC
user nobody
group nobody
status /var/log/openvpn/openvpnserver-status.log
log-append /var/log/openvpn/openvpnserver.log
verb 3
max-clients 30
keepalive 10 120
tls-server
comp-lzo
persist-key
persist-tun
push «redirect-gateway def1»
push «dhcp-option DNS 8.8.8.8»
Сертификаты и ключи для подключения клиентов также создаем согласно FAQ от разработчиков OpenVPN с использованием easy-rsa.
После настройки на каждом сервере запускаем OpenVPN
Если возникает сбой запуска, смотрим ошибки в лог-файлах и устраняем их.
Для возможности подключения клиенту необходимы следующие файлы:
ca.crt
client01.crt
client01.key
dh1024.pem
tls.key
Нужно передать их вместе с параметрами конфигурации.
Со стороны клиента в зависимости от ОС нужно выполнить такие действия.
Установить openvpn. Проверить, загружен ли модуль tun. Создать конфигурационный файл /etc/openvpn/client01.conf
client
remote 2.2.2.2 1194
proto tcp
dev tun
ca ca.crt
dh dh1024.pem
cert client01.crt
key client01.key
tls-auth tls.key 1
cipher AES-256-CBC
verb 3
mute 20
keepalive 10 120
comp-lzo
persist-key
persist-tun
resolv-retry infinite
nobind
Проверить, появился ли интерфейс tun0.
Установить OpenVPN для windosw (http://openvpn.net/index.php/open-source/downloads.html). Скопировать полученные файлы (ca.crt, client01.crt, client01.key, dh1024.pem, tls.key) в C:\Program Files\OpenVPN\config\client01. В том же каталоге создать конфигурационный файл client01.ovpn (идентичный по содержанию с client01.conf для linux). Подключиться.
После подключения проверить, как идет трафик. Оба сервера должны фигурировать в трассе:
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 10.1.0.1 (10.1.0.1) 165.178 ms 329.870 ms 329.807 ms
2 10.2.0.1 (10.2.0.1) 493.908 ms 658.640 ms 824.653 ms
.
Записки IT специалиста
Технический блог специалистов ООО»Интерфейс»
Настройка двух и более OpenVPN-серверов на одном сервере
Начнем с постановки задачи. В прошлой статье мы рассказали о настройке OpenVPN сервера в Oracle Cloud для доступа в интернет. Сервер работает, клиенты подключаются, но возникла необходимость подключения к нему роутеров Mikrotik, у которых, как известно, особые требования к настройкам OpenVPN. Как быть? Перенастроить сервер для совместимости с Mikrotik в ущерб остальным клиентам? Или поднять второй экземпляр сервера со своими настройками? Естественно, второй способ выглядит более предпочтительно.
Напомним, что все настройки мы производим на сервере с Ubuntu 18.04 в облаке от Oracle, настройка которого описана в статье по ссылке выше, рекомендуем ознакомиться с ней перед прочтением данного руководства. Однако все описанные ниже действия, с соответствующими поправками, применимы к любому Linux-дистрибутиву.
Настройка второго экземпляра сервера
Прежде всего создадим для нового сервера собственный набор ключей, для этого перейдем в папку нашего центра сертификации и загрузим переменные:
После чего создадим новый серверный сертификат:
Где server-tcp имя нашего экземпляра сервера. Мы советуем давать осмысленные имена, чтобы вам потом было понятно, что делает тот или иной экземпляр.
Скопируем ключ и сертификат в папку с ключами OpenVPN:
Затем скопируем шаблон конфигурации и назовем его server-tcp.conf:
Для того, чтобы несколько серверов OpenVPN могли работать на одном хосте они должны использовать разные порты. Но так как первый экземпляр работает по протоколу UDP, то для второго экземпляра мы также можем использовать порт 1194, но только с протоколом TCP.
Укажем топологию сети:
И пути к ключам и сертификатам:
Диапазон адресов внутри VPN-сети также должен отличаться от остальных экземпляров, поэтому укажем:
Для хранения выданных клиентам адресов, как и для логов, также следует использовать отдельные файлы:
Mikrotik игнорирует опцию настройки шлюза по умолчанию, но мы все-таки советуем добавить данную опцию, так как подключаться к данному серверу могут и иные клиенты.
Передадим собственные DNS:
Параметры проверки активности:
Обязательно выключим дополнительную TLS-аутентификацию:
И укажем параметры шифра, выключив его согласование, RouterOS поддерживает только AES128/192/256 и Blowfish 128:
Обязательно отключаем все опции сжатия:
Убеждаемся в наличии опций понижения прав:
И за сохранение доступа к ключам и адаптерам:
Укажем свой комплект файлов лога:
При использовании протокола TCP обязательно закомментируем опцию:
Сохраним файл конфигурации.
Чтобы обеспечить автоматический запуск всех серверных конфигураций OpenVPN откроем в /etc/default/openvpn и раскомментируем в нем строку:
Затем перечитаем конфигурацию юнитов systemd:
Теперь уже можно запустить наш новый экземпляр, но мы пока не будем этого делать, так как нужно перенастроить брандмауэр.
Настройка брандмауэра и маршрутизации
Очевидно, что нам нужно разрешить входящий трафик на порт OpenVPN и транзитный трафик для tun-адаптеров, также потребуется отдельное правило для маскарадинга. В итоге ваш файл /etc/nat должен будет выглядеть следующим образом:
На что следует обратить внимание? Для каждого сервера нужно разрешающее правило в цепочке INPUT, в нашем случае в секции Разрешаем подключения к OpenVPN добавлено два правила для входящих UDP 1194 и TCP 1194. Аналогично следует создать для каждой VPN-сети свое правило маскарадинга в секции Включаем маскарадинг для локальной сети.
В правилах цепочки FORWARD мы заменили tun0 на tun+, что теперь распространяет действие правил на все туннельные интерфейсы.
Если вы используете Oracle Cloud, то не забудьте создать разрешающее правило для входящих TCP 1194 в настройках вашей виртуальной сети:
Теперь можно перезапустить службу OpenVPN и убедиться, что поднялись два туннельных интерфейса:
Настройка клиентов OpenVPN
Если вы будете настраивать в качестве клиента Mikrotik, то вам потребуется только ключевая пара клиента и, опционально, сертификат CA, для проверки подлинности сервера. Для создания ключа клиента перейдите в директорию центра сертификации и загрузите переменные:
Затем выпустите сертификат клиента:
Полученные файлы и сертификат CA скопируем в домашнюю директорию:
И сменим их владельца на вашего основного пользователя, чтобы он мог спокойно скопировать их через FTP или SFTP (по умолчанию владелец файлов root). В нашем случае это пользователь ubuntu.
Если же будет подключаться иной клиент, то ему потребуется клиентский файл конфигурации, можете использовать как образец конфигурацию клиента созданную нами в предыдущей статье. В него потребуется внести следующие изменения: изменить протокол на TCP
и выключить сжатие:
Теперь что касается производительности. OpenVPN через TCP имеет гораздо более высокие накладные расходы, особенно на плохих каналах. На хороших разница обычно невелика, и вы скорее упретесь в иные ограничения. Мы выполнили два замера для нашего сервера в Oracle Cloud, первый для UDP:
Как видим, в нашем случае разница абсолютно незаметна и можно не особенно переживать за возможные потери пропускной способности. Но не следует забывать, что при тестировании использовались хорошие широкополосные каналы, в иных ситуациях, например, с мобильными клиентами, результаты могут существенно отличаться.
gushmazuko / doublevpn.md
Двойной VPN на основе OpenVPN
Сначало настроим второй сервер:
Шаг 1. Установка OpenVPN
Шаг 2. Создание директории центра сертификации
OpenVPN это виртуальная частная сеть, использующая TLS/SSL. Это означает, что OpenVPN использует сертификаты для шифрования трафика между сервером и клиентами. Для выпуска доверенных сертификатов (trusted certificates) нам потребуется создать наш собственный центр сертификации.
Создайте пользователя с именем, например, openvpn-ca и перейдите в его домашний каталог:
Для начала скопируем шаблонную директорию easy-rsa в нашу домашнюю директорию с помощью команды make-cadir:
Шаг 3. Настройка переменных центра сертификации
Для настройки переменных нашего центра сертификации нам необходимо отредактировать файл vars. Откройте этот файл в вашем текстовом редакторе:
Внутри файла вы найдёте переменные, которые можно отредактировать, и которые задают параметры сертификатов при их создании. Нам нужно изменить всего несколько переменных.
Пока мы в этом файле, отредактируем значение KEY_NAME чуть ниже, которое заполняет поле субъекта сертификатов. Для простоты зададим ему название vpnsrv2 :
Сохраните и закройте файл.
Шаг 4. Создание центра сертификации
Теперь мы можем использовать заданные нами переменные и утилиты easy-rsa для создания центра сертификации.
Вы должны увидеть следующий вывод:
Убедимся, что мы работаем в «чистой среде» выполнив следующую команду:
Теперь мы можем создать наш корневой центр сертификации командой:
Эта команда запустит процесс создания ключа и сертификата корневого центра сертификации. Поскольку мы задали все переменные в файле vars, все необходимые значения будут введены автоматически. Нажимайте ENTER для подтверждения выбора.
Теперь у нас есть центр сертификации, который мы сможем использовать для создания всех остальных необходимых нам файлов.
Шаг 5. Создание сертификата, ключа и файлов шифрования для сервера
Далее создадим сертификат, пару ключей и некоторые дополнительные файлы, используемые для осуществления шифрования, для нашего сервера.
Начнём с создания сертификата OpenVPN и ключей для сервера. Это можно сделать следующей командой:
Согласитесь со всеми значениями по умолчанию, нажимая ENTER. Не задавайте challenge password. В конце процесса два раза введите y для подписи и подтверждения создания сертификата:
Далее создадим оставшиеся файлы. Мы можем сгенерировать сильные ключи протокола Диффи-Хеллмана, используемые при обмене ключами, командой:
Для завершения этой команды может потребоваться несколько минут.
Далее мы можем сгенерировать подпись HMAC для усиления способности сервера проверять целостность TSL:
Шаг 6. Создание сертификата и пары ключей для клиента
Далее мы можем сгенерировать сертификат и пару ключей для клиента. Вообще это можно сделать и на клиентской машине и затем подписать полученный ключ центром сертификации сервера, но в этой статье для простоты мы сгенерируем подписанный ключ на сервере.
В этой статье мы создадим ключ и сертификат только для одного клиента. Если у вас несколько клиентов, вы можете повторять этот процесс сколько угодно раз. Просто каждый раз передавайте уникальное значение скрипту.
Для создания файлов без пароля для облегчения автоматических соединений используйте команду build-key :
В ходе процесса создания файлов все значения по умолчанию будут введены, вы можете нажимать ENTER. Не задавайте challenge password и введите y на запросы о подписи и подтверждении создания сертификата.
Шаг 7. Настройка сервиса OpenVPN
Далее настроим сервис OpenVPN с использованием созданных ранее файлов.
Копирование файлов в директорию OpenVPN Нам необходимо скопировать нужные нам файлы в директорию /etc/openvpn.
Сначала скопируем созданные нами файлы. Они находятся в директории
Далее нам необходимо скопировать и распаковать файл-пример конфигурации OpenVPN в конфигурационную директорию, мы будем использовать этот файл в качестве базы для наших настроек:
Настройка конфигурации OpenVPN Теперь, когда наши файлы находятся на своём месте, займёмся настройкой конфигурационного файла сервера:
Адрес сети VPN сервера
Под этой строкой добавьте строку auth и выберите алгоритм HMAC. Хорошим выбором будет SHA512 :
Наконец, найдите настройки user и group и удалите «;» для раскомментирования этих строк:
Необходимо закомментировать следующие директивы. Найдите секцию redirect-gateway и добавьте «;» в начало строки:
Сохраните и закройте файл.
Шаг 8. Настройка сетевой конфигурации сервера
Далее нам необходимо настроить сетевую конфигурацию сервера, чтобы OpenVPN мог корректно перенаправлять трафик.
Настройка перенаправления IP Сначала разрешим серверу перенаправлять трафик. Это ключевая функциональность нашего VPN сервера.
Настроим это в файле /etc/sysctl.conf :
Сохраните и закройте файл.
Для применения настроек к текущей сессии наберите команду:
Настройка правил UFW для сокрытия соединений клиентов Вам нужно установить файрвол UFW. Нам потребуется файрвол для манипулирования с входящим на сервер трафиком. Мы должны изменить файл настроек для сокрытия соединений (masquerading).
Откроем файл /etc/ufw/before.rules и добавим туда соответствующие настройки:
Это файл содержит настройки UFW, которое применяются перед применением правил UFW. Добавьте в начало файла выделенные красным строки. Это настроит правила, применяемые по умолчанию, к цепочке POSTROUTING в таблице nat и будет скрывать весь трафик от VPN:
Сохраните и закройте файл.
Теперь мы должны сообщить UFW, что ему по умолчанию необходимо разрешать перенаправленные пакеты. Для этого откройте файл /etc/default/ufw :
Сохраните и закройте файл.
Открытие порта OpenVPN и применение изменений Далее настроим сам файрвол для разрешения трафика в OpenVPN.
Также добавьте ваш SSH порт
Теперь деактивируем и активируем UFW для применения внесённых изменений:
Теперь наш сервер сконфигурирован для обработки трафика OpenVPN.
Шаг 9. Включение сервиса OpenVPN
Мы готовы включит сервис OpenVPN на нашем сервере. Мы можем сделать это с помощью systemd.
Убедимся, что сервис успешно запущен командой:
Если всё в порядке, настроем сервис на автоматическое включение при загрузке сервера:
Шаг 10. Создание инфраструктуры настройки клиентов
Далее настроим систему для простого создания файлов конфигурации для клиентов.
Создание структуры директорий конфигурации клиентов В домашней директории создайте структуру директорий для хранения файлов:
Поскольку наши файлы конфигурации будут содержать клиентские ключи, мы должны настроить права доступа для созданных директорий:
Создание базовой конфигурации Далее скопируем конфигурацию-пример в нашу директорию для использования в качестве нашей базовой конфигурации:
Откройте этот файл в вашем текстовом редакторе:
Сделаем несколько изменений в этом файле.
Убедитесь, что протокол совпадает с настройками сервера:
Далее раскомментируйте директивы user и group удаляя «;»:
Добавьте настройки cipher и auth согласно заданным в файле /etc/openvpn/server.conf :
Далее добавьте директиву key-direction в любое место в файле. Она должна иметь значение «1» для корректной работы сервера:
Создание скрипта генерации файлов конфигурации Теперь создадим простой скрипт для генерации файлов конфигурации с релевантными сертификатами, ключами и файлами шифрования. Он будет помещать сгенерированные файла конфигурации в директорию
Создайте и откройте файл make_config.sh внутри директории
Вставьте следующие текст в этот файл:
Сохраните и закройте файл.
Сделайте его исполняемым файлом командой:
Шаг 11. Генерация конфигураций клиентов
Теперь мы можем легко сгенерировать файлы конфигурации клиентов.
/client-configs и используя только что созданный нами скрипт:
Если всё прошло успешно, мы должны получить файл clientsrv2.ovpn в директории
Доставка конфигураций на первый сервер Теперь мы должны переместить файл конфигурации первый сервер SRV1.
На первом сервере делаем все идентично, кроме следующих пунктов:
Интерфейс eth0 меняем на tun1 и адрес 10.8.1.0/24 на 10.8.0.0/24
Сохраните и закройте файл.
Перенаправление всего трафика через VPN сервер
Адрес сети VPN сервера
Протокол ставим udp4
Далее раскомментируйте следующие строки. Секция redirect-gateway :
и секция dhcp-option
также эту директиву
Прописываем правила маршрутизации на первом сервере:
Создадим скрипт /etc/openvpn/upstream-route.sh содержащий следующие команды:
Далее добавим их в файл конфигурации клиента который подключается ко второму серверу.
Также в этом файле необходимо указать чтобы OpenVPN клиент всегда занимал интерфейс tun1 :
Скопируем clientsrv2.ovpn в корневую папку OpenVPN и переиминуем его в client.conf
Настраиваем автозауск
Точно так же создаем инфраструктуру настройки клиентов. Шаг 10 И сгенерированный файл переносим на клиентскую машину.