Linux несколько vpn подключений
Безопасный удаленный доступ к сервисам в локальной сети.
VPN (англ. Virtual Private Network, «виртуальная частная сеть») — обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети (например Интернет).
Наиболее популярные решения с открытым исходным кодом для построения виртуальных частных сетей — «OpenVPN» и «IPSec». В релиз ядра Linux 5.6, который состоялся 30 марта 2020 года, вошла еще одна реализация технологии VPN — «WireGuard». Это молодой набирающий популярность проект.
Основные преимущества «WireGuard»:
- Высокая производительность (бенчмарки можно посмотреть тут)
- Простая настройка
- Современная криптография
- Качественный код
В этой инструкции мы настроим VPN-туннель в локальную сеть с помощью «WireGuard» и обеспечим доступ из интернета к узлам LAN с различных устройств.
Адресация в LAN - 192.168.100.0/24, VPN-сети назначим диапазон 10.0.0.0/24.
Для размещения сервера потребуется VPS. При выборе необходимо обратить внимание на технологию виртуализации: предпочтительно KVM, можно XEN, а вот OpenVZ следует избегать. Дело в том, что в WireGuard реализован как модуль ядра, а в OpenVZ ядро очень старое. Я буду использовать самый дешевый виртуальный сервер c операционной системой Ubuntu 20.04 (KVM 512 МБ RAM 20 ГБ SSD 1 CPU - такая конфигурация вполне подойдет).
Залогинимся на сервер с правами пользователя root и выполним следующие команды:
Создадим конфигурационный файл /etc/wireguard/wg0.conf со следующим содержимым:
[Interface] Address = 10.0.0.1/24 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ListenPort = 51820 PrivateKey = <SERVER_PRIVATE_KEY>Параметры PostUp/PostDown содержат правила iptables, которые будут применены при запуске/остановке сервиса. Обратите внимание на название сетевого интерфейса — оно должно соответствовать общедоступному сетевому адаптеру, в моем случае это eth0. Вывести список адаптеров можно командой:
Выберите из списка тот, которому соответствует внешний IP-адрес. <SERVER_PRIVATE_KEY> - заменяем содержимым файла /etc/wireguard/privatekey.
Запустим VPN-сервис и добавим его в автозагрузку:
Убедимся, что служба запустилась корректно:
Если ваш роутер поддерживает WireGuard (Zyxel KeeneticOS >=3.3, Mikrotik RouterOS >=7.1beta2, OpenWRT) — можно настроить VPN-клиент прямо на нем. Я буду использовать для этой цели сервер Ubuntu 20.04 (локальный адрес 192.168.100.7).
Первый этап настройки аналогичен конфигурации серверной части. Выполняем с правами root-пользователя:
[Interface] PrivateKey = <PEER_LAN_PRIVATE_KEY> Address = 10.0.0.2/32 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wlp2s0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wlp2s0 -j MASQUERADE [Peer] PublicKey = <SERVER_PUBLIC_KEY> Endpoint = <SERVER_IP>:51820 AllowedIPs = 10.0.0.0/24 PersistentKeepalive = 20<PEER_LAN_PRIVATE_KEY> — заменяем содержимым /etc/wireguard/privatekey, <SERVER_PUBLIC_KEY> — /etc/wireguard/publickey с сервера, <SERVER_IP> — внешний IP-адрес сервера. Правила iptables в PostUp/PostDown необходимы для того, чтобы наш клиент выступал в роли шлюза в LAN. Указываем в правилах тот сетевой интерфейс, на который назначен локальный адрес (192.168.100.7, в моем случае это wlp2s0). Уточните его путем исполнения команды:
В параметре AllowedIPs задаются адреса, маршрутизация к которым будет осуществляться через VPN-интерфейс. В поле PersistentKeepalive — периодичность проверки доступности соединения в секундах. Запускаем службу и добавляем в автозагрузку:
На сервере добавляем в файл /etc/wireguard/wg0.conf блок:
Где <PEER_LAN_PUBLIC_KEY> — /etc/wireguard/publickey клиента. Перезапустим службу и убедимся, что все настроено корректно:
Проверим теперь с клиента:
Сборки WireGuard доступны для основных платформ: Linux, Windows, Mac, Android, FreeBSD, OpenWRT и др. Рассмотрим настройку VPN-клиента на десктопах под управлением Linux и Windows, а так же на Android-смартфоне.
На клиенте выполняем с правами root:
Конфигурационный файл /etc/wireguard/wg0.conf:
<PEER_1_PRIVATE_KEY> — заменяем содержимым /etc/wireguard/peer_1_privatekey, <SERVER_PUBLIC_KEY> — /etc/wireguard/publickey с сервера.
Обратите внимание на строку «AllowedIPs = 0.0.0.0/0» - в данной конфигурации весь трафик будет маршрутизироваться через VPN-адаптер. Это может понадобиться для сокрытия реального IP при работе в интернет или для защиты трафика при подключении к недоверенным сетям (например публичные Wi-Fi точки доступа). В этом случае указываем «DNS = 8.8.8.8» (8.8.8.8 - DNS-сервер Google), чтобы DNS-запросы выполнялись через защищенное VPN-соединение.
Если VPN-туннель необходим только для доступа к LAN 192.168.100.0/24 - убираем строчку «DNS = 8.8.8.8» и в параметре AllowedIPs меняем «0.0.0.0/0» на «10.0.0.0/24, 192.168.100.0/24».
На сервере в конфигурационный файл /etc/wireguard/wg0.conf добавляем блок:
. [Peer] PublicKey = <PEER_1_PUBLIC_KEY> AllowedIPs = 10.0.0.3/32Где <PEER_1_PUBLIC_KEY> — содержимое файла /etc/wireguard/peer_1_publickey клиента и перезапускаем службу:
Возвращаемся на клиент и проверяем доступность узлов в LAN через VPN-туннель:
Подключившись к новому провайдеру, предоставляющему доступ в сеть по впн пришлось столкнуться с кучей манов и факов на тему поднятия двух одновременно работающих впн-соединений в линях. Поднимал в убунте 9.10 и решил как-то скомпилировать инфу в один надеюсь понятный фак.
Данный FAQ будет полезен тем, кто хочет настроить два одновременных впн-соединения для локальной и внешней сети.
Для начала нужно скачать пакет, который обеспечит поддержку нужного нам протокола соединения, для этого введём в терминале:
sudo apt-get install pptp-linux
После того как пакет установлен, идём писать конфиг соединения в папку /etc/ppp/peers, для этого нам понадобятся права админа (если их уже нет), для удобства напишу стандартный терминальный вход с нужными правами в терминальном редакторе nano в создаваемый файл конфигурации соединения:
sudo nano /etc/ppp/peers/connection_name1
Где connection_name1 — имя создаваемого подключения (можете назвать как вам удобно).
Далее вводим в окно редактирования данные соединения:
sudo nano /etc/ppp/peers/connection_name2
Где опять же имя соединения можете придумать своё=)
Туда пишем:
Конфиги готовы.
Теперь настроим автозапуск и маршрутизацию на локалку.
Для этого редактируем /etc/network/interfaces:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
'up route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.66.6.1
auto connection_name1
iface connection_name1 inet ppp
provider connection_name1
auto connection_name2
iface connection_name2 inet ppp
provider connection_name2
Тут вы можете внести маршруты для доступа к ресурсам непосредственно через имеющееся соединение (без впн). Пример такого маршрута я закомментировал, поэтому при добавлении маршрута Вам придётся убрать символ " ' " из данного конфига.
Где на месте 10.66.6.1 должен быть Ваш локальный шлюз.
Далее идём писать скрипты маршрутов для connection_name2.
Нам нужно создать /etc/ppp/ip-up.d/route
Пишем в терминале:
sudo nano /etc/ppp/ip-up.d/route
Пишем в открывшемся редакторе маршруты вида:
Где ppp1 — ссылка на соединение connection_name2
Жмём ctrl+x, потом подтверждаем сохранение клавишей Y.
Затем делаем этот скрипт исполняемым, для этого пишем в терминале:
sudo chmod +x /etc/ppp/ip-up.d/route
Далее нужно создать скрипт на удаление маршрутов.
Пишем в терминале:
sudo nano /etc/ppp/ip-down.d/route
Пишем в открывшемся редакторе:
Жмём ctrl+x, потом подтверждаем сохранение клавишей Y.
Затем делаем этот скрипт исполняемым, для этого пишем в терминале:
sudo chmod +x /etc/ppp/ip-down.d/route
Всё, теперь пишем в терминале команду перезапуска сети:
sudo /etc/init.d/networking restart
И теперь инет настроен, маршруты прописаны. Конечная цель достигнута.
Надеюсь ничего не забыл.
Я устанавливаю новый кластер на моем новом рабочем месте, и я все еще администрирую другой кластер на своем последнем рабочем месте. По сути, я "копирую" конфигурацию первого, чтобы настроить новый.
Теперь я дома, и я хотел бы использовать оба VPN-подключения одновременно, а не одно за другим, чтобы получить доступ к обоим кластерам одновременно. На мой взгляд, это невозможно, но, может быть, у кого-то есть идея?
Одно VPN-соединение использует OpenVPN, а второе - VPNCO-клиент CISCO. Или, возможно, можно поиграть с правилами маршрута, чтобы получить это? Я не очень опытный в сети.
Я пытаюсь использовать route -n чтобы попытаться переопределить правила для различных подинтерфейсов. Вот что я получаю, когда VPN не активен:
Теперь, если я включаю VPN Cisco (VPN1):
Если я использую openVPN (VPN2):
А теперь, если я включу оба (сначала vpn2, а затем vpn1):
В идеале все запросы для xxx.xxx.xxx.0 должны идти так, как если бы активен только VPN1 (cscotun0), а все запросы для 192.168.2.0 должны проходить через 192.168.2.17 (tun0), а другие через eth0 .
Я не привык к маршрутизации и был бы признателен за любую помощь.
РЕДАКТИРОВАТЬ: вдохновленный ответами, которые я пытаюсь поиграть с командой route чтобы попытаться правильно настроить мой конфиг.
чтобы быть более понятным, я отредактировал вышеупомянутые таблицы маршрутов, чтобы отразить результат команды route -n , который является более информативным. Я также изменил свой домашний маршрутизатор, чтобы у меня дома были 10.1.0.0 nm 255.255.255.0 ip-адресов.
Если я хорошо понимаю, когда активен только VPN2 (tun0), он использует шлюз defalut моего дома (10.1.0.1) и определяет несколько новых маршрутов, скажите мне, если я неправильно понимаю:
Когда я включаю только VPN1, он переопределяет шлюз по умолчанию своим собственным (xxx.xxx.xxx.53), и все, что перенаправлено на это. Это также, почему я не вижу свою домашнюю сеть между прочим (если я прав).
Теперь я вижу, что, когда я включаю оба VPN, шлюз по умолчанию перенаправляется на шлюз VPN1 (xxx.xxx.xxx.53), и я спрашиваю: как я могу настроить правила, чтобы:
Я пытался поиграть с route add и route del но я более или менее пытаюсь сделать это методом проб и ошибок, и я бы лучше понял, что я должен делать, и если правила, которые я хочу применить прямо здесь, правильно или в принципе глупо .
РЕДАКТИРОВАТЬ 2: Следуя предложению MariusMatutiae, я добавляю сюда результат ifconfig, когда обе VPN включены:
описание того, что не работает: после того, как я включаю оба VPN, я не могу достичь VPN tun0; и если я пытаюсь ping что-то за пределами xxx.xxx.xxx.0, я получаю ping: sendmsg: Operation not permitted .
В идеале, я хотел бы получить доступ как к VPN (если DNS для сетей VNP не работает, я могу управлять им с прямым IP, не проблема), так и в идеале к локальному сетевому подключению тоже .
К сожалению, мне не хватает специалиста по iptables, чтобы понять, как мне поступить.
3 ответа 3
Конечно, вы можете использовать несколько VPN одновременно. Основная проблема в организации этого заключается в том, чтобы убедиться, что таблица маршрутизации верна, потому что все VPN будут пытаться изменить ее, не предполагая, что больше VPN делает то же самое.
Ваш сценарий очень прост, потому что вы в основном используете VPN для доступа к удаленным локальным сетям, а не для перенаправления всего вашего трафика. Последняя конфигурация потребовала бы более сложной настройки, но в вашем случае мы можем уйти с гораздо меньшим количеством работы.
Обязательным условием для этого является то, что все подсети разные: у вас дома и на двух ваших рабочих местах ».
Предположим, что вы уже договорились об этом, тогда вы должны убедиться, что ваш файл конфигурации клиента для OpenVPN не содержит следующий оператор
и что файл конфигурации сервера не содержит следующую инструкцию:
Поскольку вас интересует только работа с двумя VPN, это уже решает вашу проблему, потому что, даже если другая VPN захватит маршрут по умолчанию, в вашей таблице маршрутизации будет один маршрут по умолчанию, и все готово.
Однако Cisco VPN по умолчанию не получает маршрут по умолчанию. Так что с тобой должно быть все в порядке. Чтобы проверить, убедитесь, что выходные данные route -n содержат пару строк, как показано ниже:
где 192.168.73.1 - ваш домашний маршрутизатор по умолчанию (при необходимости измените его, если ваш маршрутизатор не 192.168.73.1).
Редактировать:
Вы также можете использовать OpenVPN на разных сетевых интерфейсах, если хотите. Например, вы можете вызвать виртуальный интерфейс на основе вашей сетевой карты следующим образом:
а теперь проверьте IP-адрес виртуального интерфейса mac0 с помощью
Затем в вашем конфигурационном файле клиента openvpn вы можете ввести инструкцию
и когда вы подключаетесь к вашему серверу OpenVPN, соединение будет привязано только к интерфейсу mac0. Затем, чтобы получить доступ к удаленной локальной сети, вам нужно не забыть привязать все приложения к одному и тому же интерфейсу mac0 и к его IP-адресу. Например, чтобы получить доступ к ПК через ssh, вам нужно будет сказать:
и так далее. Для пинга, вы должны использовать
Вполне возможно запустить несколько VPN одновременно.
Я вижу пару проблем с вашей настройкой -
В зависимости от того, что вы пытаетесь сделать, вы должны убедиться, что сервер VPN не публикует (или игнорирует или использует более низкую метрику для правильного) маршрут по умолчанию. В противном случае у вас есть VPN, пытающиеся маршрутизировать друг друга и ломаться. Конечно, это означает, что вы используете VPN для доступа только к определенным сетям / маршрутам.
Вторая проблема, которая может возникнуть (обратите внимание на дубликаты сетей 192.168.1.0 с маской сети 255.255.255.0), заключается в том, что обе сети, к которым вы пытаетесь подключиться, находятся на 192.168.1.x. Это проблема, поскольку ядро не знает, на какую вы ссылаетесь. Правильным решением является перенумерация одной из сетей, чтобы она находилась в другом сетевом блоке. (Могут быть ужасные, ужасные, ужасные хаки, которые вы можете делать с iptables и файлами hosts и другими приемами, чтобы эмулировать это в вашей системе, но это очень специализированный, хрупкий и не рекомендуемый).
Кстати, при создании таблиц маршрутов, как правило, лучше использовать переключатель «-n», чтобы они показывали IP-адреса, а не пытались разрешать имена компьютеров - имена компьютеров для нас ничего не значат .
Настраиваем L2TP VPN-сервер на платформе Linux (Debian / Ubuntu)
L2TP - один из наиболее популярных VPN-протоколов, обладающий, благодаря IPsec, отличной безопасностью, достаточной простотой и широкой поддержкой со стороны всех современных ОС. Для работы с ним не требуется установка дополнительного ПО и какие-либо сложные настройки. Мы уже рассматривали настройку L2TP VPN-сервера на платформах Windows и Mikrotik, а теперь расскажем, как настроить аналогичный сервер в Linux, дистрибутивах основанных на Debian или Ubuntu.
Перед тем, как приступать к работе над данной статьей мы внимательно изучили русскоязычный сегмент сети на предмет освещения данной темы и были весьма сильно удивлены. Большинство находящихся на первых страницах поиска ресурсов перепечатывает одну и ту же устаревшую инструкцию, даже в достаточно свежих публикациях. Но наш сайт с самого своего основания принципиально не занимается перепечатками (кроме переводов) и мы всегда проверяем на практике то, что рекомендуем нашим читателям. В этот раз нам пришлось потратить некоторое лишнее время на чтение документации, зато теперь мы можем предложить вам актуальный материал по настройке L2TP в Linux.
В качестве систем на тестовом стенде мы использовали Debian 10 и Ubuntu 20.04, но с некоторыми изменениями данная инструкция применима к любым версиям Linux со strongSwan версии 5.0 и выше.
Настраиваем IPsec
Именно с устаревшими настройками IPsec вам придется столкнуться в большинстве опубликованных инструкций. Нет, все даже будет работать, но вот безопасность такого решения окажется довольно низкой, не соответствующей современным требованиям. Поэтому, если у вас уже имеется настроенный экземпляр L2TP-сервера мы настоятельно советуем обновить его настройки.
Для работы с IPsec мы будем использовать пакет strongSwan, установим его:
Затем откроем файл настроек /etc/ipsec.conf и добавим в его конец следующие две секции:
Первая секция задает общие параметры: включает фрагментацию IKE и настраивает протокол обнаружения мертвых узлов (Dead Peer Detection, DPD), отвечающий за обнаружение неактивных клиентов. Вторая относится уже к L2TP-соединениям, указывая использовать транспортный режим IPsec, аутентификацию по общему ключу и задает используемые шифры. Приведенные значения являются рекомендуемыми и взяты из официальной документации strongSwan.
Общий ключ следует указать в файле /etc/ipsec.secrets, добавив в него следующую строку:
Где mySharedKey - общий ключ, так как от него зависит безопасность вашей VPN-сети мы рекомендуем использовать в качестве ключа случайно сгенерированную строку из букв, цифр и спецсимволов. Для этого можно воспользоваться командой:
Результатом ее выполнения станет случайная строка длинной в 18 символов.
После внесения указанных настроек перезапустим службу:
В Ubuntu имя службы несколько иное - strongswan-starter, поэтому команда будет иметь вид:
Настраиваем L2TP
Для реализации функций L2TP-сервера предназначен пакет xl2tpd, для его установки выполните:
Затем откройте файл настроек /etc/xl2tpd/xl2tpd.conf, раскомментируйте и приведите к следующему виду опции:
Большая часть опций относится к настройке протокола L2TP и требует понимания его работы, поэтому мы на них останавливаться не будем. Разберем те опции, которые имеют существенное значение. Параметр auth file указывает на файл с данными для аутентификации, а pppoptfile - набор опций для PPP-соединения, которое используется внутри L2TP-туннеля, name - имя сервера, которое будет использоваться для поиска аутентификационных данных в файле chap-secrets.
Опции local ip и ip range отвечают за локальный адрес сервера в VPN-сети и диапазон адресов для выдачи удаленным клиентам. Здесь можно использовать два подхода: выдавать клиентам адреса из диапазона локальной сети офиса и включить ProxyARP, в этом случае настраивать маршрутизацию на клиентах не требуется, они будут как-бы включены в общую сеть офиса на канальном уровне (L2), либо выдавать адреса из непересекающегося диапазона и использовать маршрутизацию. Автоматизировать создание маршрутов для Windows-клиентов можно с использованием PowerShell.
Для настройки PPP перейдем в /etc/ppp и скопируем стандартный файл настроек:
Затем открываем файл /etc/ppp/options.xl2tpd на редактирование и приводим к следующему виду. Опции перечислены в порядке их следования, нужно раскомментировать их и указать нужное значение, если опция отсутствует, то ее следует добавить в конце файла.
Если вы будете использовать ProxyARP то дополнительно раскомментируйте опцию:
Также для Windows-клиентов можно передать настройку DNS-серверов, для этого добавьте опции:
Это позволит настроить первичный и альтернативный DNS-сервера в системе.
Сохраним все внесенные изменения и перезапустим службу L2TP-сервера:
Заключительным этапом настройки будет создание учетных записей для удаленных клиентов, для этого откроем файл /etc/ppp/chap-secrets и внесем следующую строку:
Первым указываем логин, затем имя службы, оно должно совпадать с тем, которое мы указали в опции name в xl2tpd.conf, после него идет пароль и IP-адрес клиента, символ * обозначает что можно присвоить любой адрес из выбранного диапазона. Если же требуется выдать клиенту постоянный адрес, то его следует указать явно, и он не должен входить в динамический диапазон указанный в ip range, например:
Для доступа к L2TP-серверу следует разрешить в брандмауэре входящие подключения к портам 500 UDP и 4500 UDP, подключение к 1701 UDP, вопреки распространенному заблуждению, разрешать не следует.
Читайте также: