Openvpn связать две сети

Обновлено: 18.04.2024

Организация VPN каналов между офисами при помощи OpenVPN.

Организация VPN каналов между филиалами компании имеет большое значение в работе любого IT-специалиста. В данной статье рассматривается один из способов реализации этой задачи на основе программного продукта OpenVPN.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

Ниже мы рассмотрим топологию сети, в которой будем организовывать VPN-туннель, разберем особенности конфигурирования программы OpenVPN и пошагово настроим маршрутизацию для наших офисов. Статья написана из расчета, что OpenVPN будет устанавливаться на платформы Windows 7 и Windows Server 2008.

Топология сети.

Использованная нами сетевая топология стандартна. Имеется Сеть Центрального Офиса (назовем её СЦО) и Сеть Филиала (назовем её СФ). Стоит задача соединить офисы таким образом, чтобы конечный пользовательский компьютер (далее ПК1) офиса СЦО имел доступ к общим ресурсам пользовательского компьютера (далее ПК2) СФ.

OpenVPN-channels-001v.jpg

CЦО имеет в своем составе:

  • Интернет-шлюз (назовем его ИШ1) с двумя сетевыми интерфейсами:
    • 111.111.111.111 - выдаётся провайдером, смотрит в интернет.
    • 192.168.0.1 - назначается нами, смотрит в СЦО.
    • 10.8.0.1 - адрес виртуального интерфейса (интерфейс устанавливается в процессе установки программы OpenVPN). Адрес для этого интерфейса назначается программой. Мы с вами не должны менять адрес самостоятельно из управления сетевыми адаптерами.
    • 192.168.0.2 - физический интерфейс, параметры задаются нами, смотрит в СЦО.

    СФ имеет в своем составе:

    • Интернет-шлюз (далее ИШ2) с двумя сетевыми интерфейсами:
      • 222.222.222.222 - выдаётся провайдером, смотрит в интернет.
      • 192.168.1.2 - назначается нами, смотрит в СФ.
      • 10.8.0.2 - адрес виртуального сетевого интерфейса (интерфейс устанавливается в процессе установки программы OpenVPN). Адрес для этого интерфейса так же назначается программой OpenVPN.
      • 192.168.1.2 - физический интерфейс, параметры задаются нами, смотрит в СФ.

      Настраиваем OpenVPN сервер.

      Теперь перейдем к самой программе, основам и особенностям её конфигурирования. OpenVPN доступен в вариантах для Linux и Windows. Вы можете скачать установочный пакет на сайте разработчика.

      Сам процесс инсталлирования не вызовет никаких проблем. Единственное, стоит отключить антивирус на время установки, дабы избежать дополнительных проблем. На момент написания статьи, к примеру, продукты Лаборатории Касперского не блокировали установку, а лишь выводили подозрение на некоторые устанавливаемые компоненты.

      В процессе установки в систему инсталлируется виртуальный сетевой адаптер TAP-Win32 Adapter V9 и, соответственно, драйвер к нему. Этому интерфейсу программа OpenVPN как раз и будет назначать ip адрес и маску виртуальной сети OpenVPN. В нашем случае ему назначен адрес 10.8.0.1 с маской 255.255.255.0 на сервере ОС и 10.8.0.2 с аналогичной маской на клиенте ОК.

      OpenVPN-channels-002.jpg

      По стандарту программа устанавливается в C:\ProgramFiles\OpenVPN. В этой директории следует сразу же создать дополнительно папку keys (здесь мы будем хранить ключи аутентификации) папку ccd (здесь будут находится конфиги настроек сервера для клиента).

      В директории C:\ProgramFiles\OpenVPN\sample-config представлены стандартные конфиги. Конфиги, которые мы будем создавать, должны размещаться в директории C:\Program Files\OpenVPN\config.

      Настройка OpenVPN начинается с генерации ключей. Генерируемые ключи делятся на:

      • главный CertificateAuthority (CA) сертификат и ключ, используемый для подписывания каждого сертификата сервера и клиента.
      • публичный и приватный ключи для сервера и каждого (это важно) клиента отдельно.

      Последовательность создания ключей следующая (названия файлов сертификатов и ключей указаны в скобках):

      • Генерируем основной CA (ca.crt) сертификат и CA (ca.key) ключ.
      • Генерируем сертификат (server.crt) и ключ (server.key) сервера.
      • Генерируем сертификат (office1.crt) и ключ (office1.key) для клиента.
      • Генерация параметров DiffieHellman (dh1024.pem).
      • Генерация ключа tls-auth (ta.key) для аутентификации пакетов.

      Разберем каждый пункт более подробно.

      Генерируем основной сертификат СА и СА ключ:

      Заходим в Пуск - Выполнить набираем cmd, жмем OK, заходим в командную строку. Пишем:

      Таким образом мы находимся в директории easy-rsa:

      OpenVPN-channels-003.jpg

      Во время выполнения всех пунктов генерации ключей вы должны находиться именно в ней. Выполняем команду:

      Не закрывая командную строку, зайдем в C:\ProgramFiles\OpenVpn\easy-rsa и отредактируем файл vars.bat, заполнив следующие параметры (указав, естественно, свои данные):

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

      Последняя команда как раз и выполняет генерацию СА сертификата и СА ключа. В процессе создания ключа вам будут задавать вопросы, на которые вы можете отвечать просто нажатием Enter'a (тогда значения будут браться из файла vars.bat который мы редактировали выше) или же вводить свои. Стоит обратить внимание на вопрос:

      Здесь вы должны задать название для сервера - в примере мы ввели OpenVPNS.

      Генерируем сертификат (server.crt) и ключ (server.key) сервера.

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

      На вопросы отвечаем так же как в первом пункте. На вопрос:

      Введем: server. На вопросы:

      надо дать положительный ответ: Y.

      Генерируем сертификат (office1.crt) и ключ (office1.key) для клиента.

      Очевидно, что клиентов может быть много, в нашем примере он один - office1. В зависимости от количества клиентов следующая команда в командной строке выполняется несколько раз, причем названия генерируемых ключей так же меняйте:

      если требуется еще сертификаты и ключи, скажем для второго клиента, то вводим:

      В процессе ответа на вопросы не забывайте, что каждый клиент на вопрос CommonName должен получить уникальное имя, например: office1, office2 и т.д.

      Генерация параметров DiffieHellman (dh1024.pem).

      Вводим в командной строке, находят во все той же директории easy-rsa:

      Генерация ключа tls-auth (ta.key) для аутентификации пакетов

      В конце создаем ключ для tls-аутификации командой:

      Теперь разберемся с тем, какие файлы оставлять на сервере, а какие перенести клиенту. На сервере (OC) должны находиться в созданной нами папке keys только следующие файлы:

      • ca.crt
      • ca.key
      • dh1024.pem
      • server.crt
      • server.key
      • ta.key

      OpenVPN-channels-004.jpg

      На клиенте OK аналогично серверу ОС создадим так же папочку keys, там должны быть:

      • ca.crt
      • office1.crt
      • office1.key
      • ta.key

      Все файлы с расширением .key являются секретными. Передавать их стоит только по защищенным каналам, лучше на физическим носителе.

      Далее приступим к созданию конфига для нашего сервера ОС и клиента ОК. В директории config создаем файл со следующим названием и расширением: server.ovpn Открываем его блокнотом и начинаем писать конфиг:

      Выбираем протокол для передачи данных - в данном случае upd:

      Стандартный порт для OpenVPN:

      Режим работы программы L3-туннель. В данном режиме OpenVPN - роутер:

      Данного топология доступна с версии 2.1 и заключается в том что каждому клиенту выдается по 1 адресу, без виртуальных портов маршрутизатора:

      Маршруты добавляются через .exe - это важно:

      Задержка при добавлении маршрута, можно уменьшить до 5:

      Данная опция задает организацию сети. У нас появляется виртуальная сеть 10.8.0.0 /24. Первый адрес из этой сети, то есть 10.8.0.1 выдается серверу, последующие (10.8.0.2, 10.8.0.3 и т.д.) клиентам. DHPC сервер получает адрес 10.8.0.254:

      Задаем шлюз в openvpn сеть:

      Директория, в которой мы должны расположить файл с названием нашего клиента, то есть office1 без расширения, и в нем записать команды, которые будут выполнятся на клиенте:

      Далее идут пути до файлов сертификатов и ключей сервера. Заметим, что пути обязательно пишутся с двойной чертой, а именно \\:

      Задаем серверу ОС маршрут на всю сеть:

      Выбираем метод сжатия:

      Задаем сжатие трафика:

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

      Cервер пингует противоположную сторону с интервалом в 10 секунд и если сторона не отвечает за 60 секунд, то сервер запустит пересоединение:

      Далее переходим в директорию ccd и создаем файл, в котором будут лежать команды, посылаемые клиенту от сервера. Назвать его надо так же как мы называли самого клиента, например office1. Файл не будет иметь расширения.

      OpenVPN-channels-005.jpg

      Редактируем его через блокнот. Все параметры, заданные ниже, будут автоматически переданы клиенту:

      Задаем ip и маску для нашего клиента office1:

      Передаем ему маршрут на всю сеть:

      Задаем для него шлюз:

      Эта команда говорит серверу ОС о том, что за данным клиентом, а именно ОК (office1) находится сеть 192.168.1.0:

      Таким образом, мы закончили конфигурирование сервера на стороне ОС.

      Настройка клиента.

      Далее приступим к изменению параметров клиента. Зайдем на машине ОК в папку config. Создадим в ней файл office1.ovpn Приступим к его редактированию, ряд опций повторяет аналогичные на сервере, поэтому мы их пояснять не будем:

      Указываем внешний адрес ИШ1:

      Клиент будет в работать в режиме тлс-клиента:

      Эта опция защищает от подмены сервера третьим лицом:

      Эти опции аналогичны серверу:

      Задаем маршрут к сети 192.168.0.0:

      Этой командой разрешаем прием конфигурации клиента с сервера:

      Остальные опции также аналогичны серверу:

      На этом настройка программы на стороне клиента ОК закончена.

      Настройка брандмауэра и маршрутизация.

      И так, мы имеем настроенные конфиги на ОК и на ОС. Теперь разберем очень важные моменты. Заранее оговоримся, если вы использует KIS 2011 или подобные антивирусные программы, то в настройках сетевого экрана следует разрешить прохождение ICMP пакетов. Это позволит беспрепятственно пинговать хосты в наших сетях.

      OpenVPN-channels-006.jpg

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

      OpenVPN-channels-007.jpg

      На ИШ1 должны быть проделаны следующие действия:

      • Настроено перенаправление порта 1194 протокола UDP с интерфейса 111.111.111.111 на интерфейс сервер ОС 192.168.0.2
      • В файерволе должна быть разрешена передача по порту 1194 протокола UDP, иначе пинг не будет проходить даже между ОС и ОК.

      На ИШ2 надо предпринять аналогичные действия:

      • Настроить перенаправление порта 1194 протокола UDP с интерфейса 222.222.222.222 на интерфейс клиента ОК 192.168.1.2
      • Проверить, открыт ли порт 1194 протокола UDP в файерволе.

      В Usergate 5.2, к примеру, настройка форвардинга пакетов по порту 1194 протокола UDP выглядит так:

      На этом этапе мы уже пингуем ОК и ОС по их OpenVPN адресам, то есть 10.8.0.1 и 10.8.0.2. Далее нам необходимо обеспечить правильный маршрут пакетов с клиента ОК до удаленной сети 192.168.0.0. Делаем это одним из нескольких способов:

      Либо задаем постоянный маршрут до этой сети на самом клиенте ОК:

      Либо задаем этот маршрут в ccd конфиге клиента на сервер, а именно в файле office1 допишем:

      Так же это можно сделать, добавив строку напрямую в конфиг клиента ОК:

      Но мы бы не рекомендовали загружать его, а делать все на стороне сервера.

      Затем необходимо обеспечить маршрут пакетов с сервера ОС до удаленной сети 192.168.1.0. делается это аналогично варианту выше за несколькими исключениями.

      Добавляем команду в конфиг сервера ОС:

      или же добавляем команду непосредственно в командной строке:

      Так же необходимо на сервере ОС и клиенте ОК включить в службах службу Маршрутизации и удаленного доступа, таким образом обеспечив маршрутизацию на внутреннюю сеть (форвардинг). Без этого внутренние адреса в сетях СЦО И СФ клиента ОК и сервера ОС не будут пинговаться.

      OpenVPN-channels-009.jpg

      На этом этапе мы уже свободно можем пинговать внутренние адреса наших ОС и ОК, т.е. набирая на сервере ОС ping 192.168.1.2 и на клиенте ОК ping 192.168.0.2 мы получаем положительный результат в виде:

      OpenVPN-channels-010.jpg

      Таким образом ОК и ОС взаимно пингуются по своим OpenVPN и внутренним СЦО и СФ адресам. Дальше нам надо прописать маршрут в командной строке в сеть 10.8.0.0 на наших ПК1 и ПК2. Делается это следующими командами:

      В результате расшаренные ресурсы в ПК1 и ПК2 будут доступны по их внутрисетевому адресу:

      OpenVPN-channels-011.jpg

      Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

      Данная статья посвящена объеденению нескольких домашних локальных сетей с предоставлением прозрачного общего доступа к ресурсам сетей с помощью VPN. За реализацию VPN взята openvpn. Клиенты и сервер openvpn установлены на роутерах домашних сетей, в конкретном случае роутеры семейства asus wl500, но данный мануал вполне применим и другим роутерам где есть досуп к OS и можно поставить openvpn.

      Хотя подобных руководств в Интернете пруд пруди, они написаны больше для администраторов, которые имеют большой опыт общения с *nix системами, в то время как пользователями домашних роутеров являются в основном не хакеры, а обычные юзеры, может быть впервые увидевшие коммандную строку Linux на том самом роутере. Я постараюсь писать так чтобы было понятно всем.


      Для тех кто не любит много букв, чтобы было понятно о чём речь под катом, привожу картинку

      Итак, ещё раз формализую задачу. У нас есть несколько сетей имеющих выход в Интеренет через роутер, нам нужно предоставить доступ к ресурсам сетей друг друга через шифрованный интернет-тунель.

      Что там понадобится

      1. Роутеры семейства asus wl500
      2. Очень желательно снабдить роутеры usb-флешками, так как в роутере очень мало флеш и оперативной памяти, подойдёт совершенно любая, ну кроме уж совсем раритеного старья, то есть меньше 9Mb. Чем не отличный повод порадовать себя новой флешкой? :)
      3. Хотя бы один из роутеров должен выходить в Интеренет с реальным IP адресом, либо все роутеры должны быть в одном сегменте локальной сети провайдера.
      4. Сети за роутерами должны иметь разный диапазон адресов
      5. Немного времени и мозга

      Настраивать роутеры нужно будет вместе, поэтому желательно иметь к ним доступ одновременно. Бегать из одной квартиры в другую не особо удобно, поэтому можно либо обеспечить доступ из Интернета к компьютерам за роутерами (как это сделал я), либо просто собрать роутеры в одной квартире и прицепить клиентские (ой забежал вперёд) роутеры к сервеному, тогда на месте их постоянной работы нужно будет только изменить адрес openvpn сервера.

      Теория

      Рассмотрим кратко как будет работать система. Сеть состоит из сервера (на рисунке это роутер Mars) и клиентов Earth и Mercury. Сервер обеспечивает функционирование виртуальной сети, шифрование трафика и маршрутизацию пакетов из одной сети в другой.

      Более подробно работа сервера показана на следующем рисунке (рисунок очень условный, он только для общего понимания и не отражает компоненты программы). В клиентском режиме openvpn работает точно также, только не осуществляет маршрутизацию.


      Итак у нас есть сеть с диапазоном адресов 192.168.1.1-192.168.1.255 за первым роутером (Mars) и с диапазоном 192.168.2.1-192.168.2.255 за роутером Earth. OpenVPN создаёт специальную виртуальную сетевую карту tun0, и пакеты попавшие туда рашифровываются и отправляются на сервер (на серверном компьютере локально, на клинетском через интеренет), где они расшифровывются и отправляются по нужным тунелям до адресата.

      Практика

      • openvpn — ну это нетрудно догадаться :)
      • vim — текстовый редактор (тот который встроен в оболочку совершенно ни для чего не годится)
      • wget-ssl — понадобится для обновления записей в dns, если у сервера динамический внешний ip.

      Пока пакеты устанавливаются мы немного отвлечемся от Линукса и сгенерим ключи для vpn соединения. Как это сделать под Windows (линуксоиды, думаю, уже в теме :) ) уже подробно рассматривалось на хабре, повторятся тут нет смысла, следует только добавить что ca.key надо бы убрать куда нибудь подальше, например записать на ненужную флешку., а флешку положить в сундук под 33 замка, так как зная ca.crt и ca.key можно спокойно подключится к вашей домашней сети, что ясно не входит в наши планы.

      Имея под рукой сертификаты их надо положить на роутер который будет сервером, так как это обычные текстовые файлы, то можно просто скопипастить их в текстовый редактор на роутере.
      Подключаемся с помощью telnet к роутеру, например

      $vim /opt/etc/openvpn/keys/ca.crt
      Потом нажимаем кнопку i, вставляем содержимое файла ca.crt. Тоже самое делаем с файлами dh2048.pem, mars.crt и mars.key.

      После этого нужно создать файл конфигурации openvpn, входящий в комплект можно выбросить и вставить этот:

      $rm /opt/etc/openvpn/openvpn.conf
      $vim /opt/etc/openvpn/openvpn.conf

      tls-server
      server 192.168.255.0 255.255.255.0
      ifconfig 192.168.255.1 192.168.255.2

      dh /opt/etc/openvpn/keys/dh1024.pem
      ca /opt/etc/openvpn/keys/ca.crt
      cert /opt/etc/openvpn/keys/home2.crt
      key /opt/etc/openvpn/keys/home2.key

      port 1194
      proto udp

      user nobody
      group nobody

      comp-lzo
      persist-tun
      persist-key
      verb 3

      log-append /opt/var/log/openvpn/openvpn.log
      status /opt/var/log/openvpn/status.log

      Создадим директорию в которой будет находится конфигурация для клиентов

      В это директории необходимо создать файлы для тех клиентов за которыми будут находится объединяемые сети. В нашем случае это клиент Earth, создаём файл Earth

      Он у нас будет состять всего из одной строчки

      Эта строчка говорит openvpn куда отправлять пакеты для сети 192.168.2.0/24.

      Всё, запускаем openvpn

      Если всё ok, то вывод netstat -ul | grep 1194 дожен выдавать сторчку
      udp 0 0 *:1194 *:*

      а в файле /opt/var/log/openvpn/openvpn.log Появится запись об успешном запуске сервера.

      Итак, сервер работает, надо дать возможность пакетам проходить через firewall.
      Для этого:
      $iptables -I INPUT -p udp --dport 1194 -j ACCEPT
      $iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
      $iptables -I FORWARD -i tun0 -o br0 -j ACCEPT
      $iptables -I INPUT -i tun0 -p tcp --dport 80 -j ACCEPT

      Чтобы правила применялись каждый раз их надо добавить в файл /usr/local/sbin/post-firewall, а строчку /opt/etc/init.d/S20openvpn дописать в post-mount, чтобы сервер стартовал каждый раз при запуске роутера ($ обозначает прилашение командной строки, в файлы его вносить не надо!).

      (Вы не забыли записать изменения в flashfs?)

      На этом настройка сервера практически закончена. Единственное, если сервер имеет динамический ip, то надо позаботится чтобы клиенты знали какой IP сейчас имеет сервер. Для этого есть такая штука как DDNS, то есть динамический DNS. Asus имеет встроенную поддержку некоторых DDNS провайдеров, но не всех, например моего нет. Поэтому я написал простенький скрипт, который обновляет IP на DNS, если IP роутера изменился:

      /sbin/ifconfig $IFACE > /dev/null 2>&1
      if [ "$?" -ne "0" ]
      then
      logger "update_ip.sh: Interface $IFACE is down, exiting. "
      exit 1
      fi

      new=`/sbin/ifconfig $IFACE|grep inet\ addr|sed -e 's/.*\ addr:\([0-9\.]*\).*/\1/'`

      if [ -f $TMPFILE ]
      then
      old=`cat $TMPFILE`
      else
      touch $TMPFILE
      old=" "
      fi

      if [ "$new" != "$old" ]
      then
      /opt/bin/wget --no-check-certificate "https://dynamicdns.park-your-domain.com/update?host=mars&domain=yourdomain&password=PASSWORD" > /dev/null 2>&1
      logger "update_ip.sh: New ip $new detected"
      echo $new > $TMPFILE
      fi

      Как поставить и настроить cron очень подробно написано тут: wl500g.info/showpost.php?p=52524&postcount=1

      Конфиг клиента, в поле remote нужно вставить адрес сервера

      client
      dev tun
      proto udp
      remote mars.yourdomain 1194
      resolv-retry infinite
      nobind
      persist-key
      persist-tun
      ca /opt/etc/openvpn/keys/ca.crt
      cert /opt/etc/openvpn/keys/Earth.crt
      key /opt/etc/openvpn/keys/Eartth.key
      ns-cert-type server
      comp-lzo
      verb 3
      log-append /opt/var/log/openvpn/openvpn.log
      status /opt/var/log/openvpn/status.log

      Аналогично применяем правила iptables:
      $iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
      $iptables -I FORWARD -i tun0 -o br0 -j ACCEPT
      $iptables -I INPUT -i tun0 -p tcp --dport 80 -j ACCEPT

      Запускаем openvpn на клиенте, он соединеятся с сервером и радуемся жизни. Можно смотреть фильмы, фотографии и рубится в игры как по локалке.

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

      Ну, надеюсь это будет кому-то полезно, я что-то устал писать этот эпический мануал.

      В качестве домашнего задания подключите компьютер Mercury, чтобы он имел доступ к локальным ресурам из любого места, например по gprs или публичного wifi.

      В качестве advanced домашнего задания, отнимите у mercury возможность подсоединятся к сети, изменив только конфигурацию Mars.

      Обычно, при создании VPN, используется подключение типа точка-точка к некоторому серверу, либо установка ethernet-туннеля с некоторым сервером, при котором туннелю назначается определённая подсеть. Сервер VPN при этом выполняет функции маршрутизации и фильтрования трафика для доступа к локальной сети через VPN.

      Данная статья рассматривает другой подход к созданию виртуальной сети, при котором удалённые системы включаются в уже существующую локальную подсеть, а сервер VPN выполняет роль Ethernet-шлюза. При использовании такого подхода мы всё ещё имеем возможность фильтровать трафик на основании способа подключения (например, использовать для локальной сети и для удалённых пользователей разные фильтры), но исключается необходимость настройки маршрутизации, а удалённые машины включаются прямо в локальную сеть, видят ресурсы, даже способны использовать широковещательные посылки вообще без дополнительной настройки. Через такой VPN у них отображаются все компьютеры локальной сети Windows, все доступные XDMCP-серверы при XDMCP broadcast и т. д.

      Структура сети и настройка сервера

      Предположим, что имеется офис с локальной сетью, используется IP-подсеть 192.168.168.0/24. В эту локальную сеть мы включим домашних пользователей, то есть они будут иметь адрес из этой же самой подсети. Необходимо убедиться, что у них «дома» не встречается данная подсеть, и что никакие системы в локальной сети не имеют адресов из диапазона, который мы выделим для удалённых пользователей.

      Поддержка моста в ядре

      Для работы такой техники нам нужны некоторые ядерные драйвера. Это универсальный драйвер виртуальных сетевых интерфейсов tun, и драйвер ethernet-моста bridge. Можно включить их в ядро, или собрать модулями:


      Если они будут собраны модулями, необходимо либо включить автоматическую загрузку модулей в ядре, либо загружать их самому перед установкой VPN-соединения.

      Программное обеспечение

      Для сервера потребуется OpenVPN и утилиты для обслуживания моста. В Gentoo они собираются следующим образом:

      При использовании >=sys-apps/baselayout-1.12.6 этого достаточно, для более старых версий потребуются специальные утилиты для обслуживания tun/tap-устройств:

      Настройка сети

      Положим, eth2 — интерфейс, к которому подключена локальная сеть, с назначенным адресом 192.168.168.254. Его настройка выглядела примерно так:

      Поскольку он будет участвовать в мосте, ему не нужно назначать адреса. Также, в мосте участвует вновь создаваемый виртуальный интерфейс tap0, которому тоже не назначается никакого адреса. Адрес, который использовался eth2, назначается теперь мосту br0:

      Также нужно создать настроечные скрипты для указанных интерфейсов:

      Достаточно автоматически загружать только интерфейс br0. depend_br0() автоматически поднимет все остальные необходимые ему для работы:

      Создание ключей OpenVPN

      Мы будем авторизовывать клиентов посредством RSA-ключей OpenSSL. Для упрощения процесса, для нас приготовили несколько init-скриптов:

      Там есть файл vars, в который мы занесём общие значения:

      Внизу этого файла мы заполняем наши переменные:

      Загружаем переменные из этого файла и строим CA (Certificate Authority):

      Ключ сервера

      Для генерации ключа сервера с именем office, используем следующую команду:

      На вопрос «Common Name» нужно ответить именем сервера (в нашем случае, office). На два вопроса в конце «Sign the certificate? [y/n]» и «1 out of 1 certificate requests certified, commit? [y/n]» отвечаем «y».

      При необходимости, можно будет создать дополнительные ключи серверов. Например, это могут быть резервные серверы доступа для повышения надёжности системы. Они создаются той же командой, перед ней нужно выполнить source ./vars.

      Параметры Диффи-Хеллмана

      Здесь ничего дополнительно делать не придётся, но придётся подождать.

      Этот файл нужен только на сервере.

      Ключи клиентов

      Каждому клиенту необходимо выдать свой ключ. Для клиента с именем client ключ создаётся командой

      На вопрос о «Common Name» отвечаем именем клиента (в данном случае, client). На два вопроса в конце отвечаем согласием.

      Сгенерированные ключи и сертификаты передаём клиентам через защищённый канал. При необходимости, можно создавать ещё ключи той же командой. Перед её запуском, необходимо загрузить окружение — выполнить source ./vars.

      Настройка и запуск сервиса OpenVPN

      Для запуска следует использовать следующую конфигурацию сервера (файл /etc/openvpn/openvpn.conf):

      Ключ office.key должен иметь режим 600 (доступ только владельцу). Файлы office.crt и dh1024.pem имеют режим 644.

      Настройка фильтрования

      Поскольку мы используем мост, есть несколько особенностей организации фильтрования пакетов. Например, не все проходящие пакеты могут вообще оказаться IPv4. Для настройки работы моста в ядре существует несколько параметров:

      • bridge-nf-call-arptables
        Логическая переменная bridge-nf-call-arptables управляет передачей трафика ARP в цепочку FORWARD пакетного фильтра arptables. Установленное по умолчанию значение 1 разрешает передачу пакетов фильтрам, 0 – запрещает.
      • bridge-nf-call-iptables
        Логическая переменная bridge-nf-call-iptables управляет передачей проходящего через мост трафика IPv4 в цепочки iptables. Используемое по умолчанию значение 1 разрешает передачу пакетов для фильтрации, 0 – запрещает.
      • bridge-nf-call-ip6tables
        Действие аналогично предыдущему, только оно настраивает передачу трафика IPv6 для фильтрования в цепочки ip6tables.
      • bridge-nf-filter-vlan-tagged
        Логическая переменная bridge-nf-filter-vlan-tagged определяет возможность передачи трафика IP/ARP с тегами VLAN программам фильтрации пакетов (arptables/iptables). Значение 1 (установлено по умолчанию) разрешает передачу пакетов с тегами VLAN программам фильтрации, 0 – запрещает.

      Для фильтрования пакетов, проходящих через мост, используется соответствие physdev, которое различает, с какого и на какой порт моста следует пакет. Включаем его в ядре:

      Кроме этого, конфигурация ядра должна разрешать передачу пакетов на фильтрацию iptables, т.е. bridge-nf-call-iptables=1 и bridge-nf-call-ip6tables=1 (если вы используете IPv6).
      После можете использовать, например, такие правила для фильтрования:


      Поподробнее про настройку фильтрации между портами поста можно почитать в статье Building bridges with Linux

      Если вы не хотите делать никаких различий между пользователями LAN и пользователями bridged VPN, вы можете просто выключить эти параметры в ядре (они включены по умолчанию):

      Клиенты

      На клиенте необходимо создать конфигурационный файл OpenVPN следующего содержания:

      Если сервер подключен через несколько провайдеров, можно повысить устойчивость сети к отказам. Для этого клиенту нужно прописать несколько опций remote, по одной на сервер, в порядке «сначала предпочтительные».

      Имена файлов, указанные в параметрах ca, cert и key — это файлы, переданные через защищённый канал. Права доступа к файлу key должны быть установлены в 600.

      Linux

      Необходим universal tun/tap driver в ядре, либо модулем, но загруженный.

      Gentoo

      Соответственно, помещаем туда вышеприведённый конфиг, создаём симлинк и кладём скрипты в поддиректорию в /etc/openvpn/. В конфиге прописываем полный путь к ключу и сертификатам. Следите, чтобы имена файлов в конфиге не пересекались, во избежание неприятных эффектов!

      Windows

      Конфигурационный файл помещается в директорию «C:\Program Files\OpenVPN\config\» с именем вроде «office.ovpn», туда же помещаются остальные файлы — ключи и сертификаты. Если мы их помещаем в поддиректорию (например, хотим использовать несколько виртуальных сетей и все они предоставили файлы с одинаковым именем ca.crt), указываем полные пути к файлам.

      Для запуска сетей можно либо запустить сервис OpenVPN (тогда будут запущены все конфигурации *.ovpn, найденные в config\), либо по отдельности — щёлкаем по файлу .ovpn правой кнопкой и выбираем «Запустить OpenVPN с этой конфигурацией».

      Возможные проблемы

      Проверить доступность сервера, если он запущен на TCP, можно обычным telnetом.

      Windows

      Нет свободного виртуального адаптера TAP

      По логу OpenVPN видно, что клиент успешно присоединился к серверу, авторизовался, но не смог привязать виртуальную сеть к виртуальному адаптеру. Скорее всего, какие-то другие процессы уже задествовали все имеющиеся в системе адаптеры TAP-Win32. Это мог быть и сам OpenVPN, повисший и не отдавший адаптер.

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

      Ссылки

      P.S. Некоторые источники почили. Ссылки я убирать не буду, но стоит иметь ввиду.



      Недавно меня попросили разобраться в настройке L2 туннеля для моста между двумя удалёнными локальными сетями, и я был поражён, насколько мало удобных решений мне удалось найти. Раньше я не интересовался этой темой и наивно полагал, что любой адекватный VPN-протокол умеет ловить широковещательные пакеты и пересылать их по обычному L3 туннелю. К сожалению, доступных «из коробки» универсальных решений нет. Есть несколько протоколов и инструментов для них, большинство из которых работает в очень ограниченных условиях или вовсе объявлено deprecated. Самым приятным вариантом я поделюсь дальше.

      Почему именно L2?

      Этим вопросом я задался в первую очередь: я довольно редко работаю с сетевой периферией, и мне казалось что довольно давно уже всё оборудование умеет ходить по L3. Как бы не так: кому-то нужен доступ к офисным принтерам, кому-то к видеорегистраторам, а кто-то просто хочет зарубиться с другом в LAN-дуэли — не выходя из дома, разумеется. Также очень привлекательной выглядит идея общих/сетевых папок в офисе, доступных из дома, особенно в период повальной удалёнки.

      При этом среди разработчиков VPN-клиентов L2-бриджи почему-то считаются чем-то вроде странного каприза одного-двух процентов пользователей, который по большому счёту никому не нужен. Совсем иначе обстоят дела в промышленных сетях, где много устаревшего или плохо совместимого оборудования, и концепция L2VPN (представленная кучей других аббревиатур) реализована на уровне сети и оборудования провайдера.

      Технологии

      Их много, и они все работают со странностями и ограничениями:

      • Например, протокол Layer 2 Tunneling Protocol (L2TP) должен, судя по названию, обеспечивать поддержку OSI L2 и в том числе проброс broadcast'a. Но нет, общепринятая связка L2TP + IPsec не позволяет бриджевать сети на уровне L2!
      • PPTP — стал мемом из-за крупных уязвимостей, сейчас кое-как починен, но к L2 уже не имеет отношения.
      • MPLS — жутко запутанный «промышленный» протокол на основе меток. Изучить его сложно, а поднять можно только на специализированном железе или RouterOS (с ограничениями, куда ж без них).
      • PPPoE и феерический PPPoEoE тоже работают, но на проприетарных железках. Режим PPPoE вообще есть на многих роутерах, но как его правильно готовить известно по большей части только на фирменном оборудовании типа Cisco.
      • EoIP должен быть стать тем самым L2VPN made right, но он тоже работает только на микротиках, что существенно сужает круг применения. Как и PPTP, используя GRE, не проходит через NAT.

      Мы часто пользуемся личным или рабочим VPNом, у многих он вообще включён на постоянной основе для обхода блокировок (хотя эта тенденция идёт на спад после снятия блокировки Telegram). В своих рабочих задачах я тоже постоянно пользуюсь удаленными хостами для разработки, и почти всегда использую OpenVPN. Долгое время я не понимал, зачем нужна связка OpenVPN Access Server + OpenVPN Connect на клиенте. Для моих задач мне всегда хватало классической версии с ручной правкой конфигов, и выделенные админки и GUI казались неуместными в стройном тонком клиенте. Но оказалось, что для настройки бриджа интерфейс гораздо удобнее чем простыни конфигов в терминале, хотя и с ним не всё идеально.

      Настройка

      Дело в том, что Access Server (AS) выходил как платный и довольно дорогой продукт, поэтому в него старательно напихали всевозможных плюшек, лишь бы купили. Таким образом в веб-админке появился подпункт меню, позволяющий выбрать режим сети (L2 bridging/L3 routing), а через какое-то время тихонько был оттуда выпилен по всё той же причине «это никому не нужно». Тем не менее, сам функционал бриджинга и соответствующие скрипты не удаляли и их по-прежнему можно настроить.

      Установка

      Нам потребуется сервер или виртуальная машина. Образ для неё находится на странице загрузки, а мы будем дальше разбирать кейс с установкой на сервер под Ubuntu 18.04:


      Сразу нужно указать пароль для админской учётки:


      Затем можно открывать админку в браузере (на :943/admin, как указано выше), логиниться под пользователем openvpn с указанным паролем и настраивать сервер.


      AS бесплатна для использования двумя пользователями, дальше можно добавлять только за $18/месяц за одного пользователя, так что лучше сразу спроектировать свои процессы под использование туннеля двумя клиентами.

      Возвращаем бриджинг

      Если всё прошло успешно, в выведенном json'е будет такое:


      В админке статус «OSI Layer: 3 (routing/NAT)» поменяется на «2 (bridging)»

      NB: в последних версиях может оставаться информация о L3 при включённом bridge. Почему — не разбирался, безопасные в этом плане версии около 2.4

      Собственно на этом ноу-хау заканчивается, дальше вам нужно просто настроить под себя сервер, завести второго пользователя через тот же веб-интерфейс и залогиниться на пользовательскую страницу на 943 порту (без /admin). Там будут ссылки на скачивание клиентов OpenVPN Connect под все платформы с запечённым конфигом для подключения (кроме мобильных приложений, там придется вбить адрес вручную, а дальше всё само установится).

      После успешного подключения и бриджевания клиентов, будет доступен L2-туннель с TCP/UDP трафиком. Клиенты могут выступать натом для внутренней сети, это всё тоже настраивается в админке.

      Организация каналов между офисами при помощи OpenVPN с дополнительной парольной защитой

      OpenVPN пользуется заслуженной популярностью у системных администраторов, когда нужно быстро и эффективно соединить VPN-каналами удаленные офисы. Сегодня предлагаем вам статью нашего читателя в которой он расскажет вам как настроить безопасный канал между офисами с дополнительной парольной защитой на платформе Windows.

      Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

      И так нам нужно организовать VPN канал между двумя офисами. Сеть Офис 1 (назовем его С_ОФ1) и Сеть Офис 2 (назовем его С_ОФ2).

      Скажу сразу что в моем случае OpenVPN в обоих офисах установлен на Windows 7.

      С_ОФ1 включает:
      Машина куда ставим OpenVPN Server имеет 2 сетевых интерфейса.
      Также на ней установлен прокси-сервер который раздает инет в локалку, тем самым являясь для всех машин в локалке основным шлюзом(192.168.0.100)
      192.168.0.100 смотрит в сеть
      192.168.1.2 смотрит в мир через роутер. Роутер имеет статический IP скажем 111.222.333.444. На роутере сделан проброс порта 1190 (в моем случае порт 1190 проброшена на 192.168.1.2)
      Пользователь в сети: 192.168.0.50

      С_ОФ2 включает:
      Машина куда ставим OpenVPN Client имеет 2 сетевых интерфейса.
      Также на ней установлен прокси-сервер который раздает инет в локалку, тем самым являясь для всех машин в локалке основным шлюзом(172.17.10.10)
      172.17.10.10смотрит в сеть
      192.168.1.2 смотрит в мир через роутер.
      Пользователь в сети: 172.17.10.50

      Задача: Пользователь С_ОФ1(192.168.0.50) должен видеть расшареные ресурсы на Пользователе С_ОФ2 (172.17.10.50) и наоборот.

      OpenVPN-channels-pass-001.jpg

      Приступаем к настройке

      Скачиваем OpenVPN с официального сайта в соответствии с разрядностью системы.

      OpenVPN-channels-pass-002.jpg

      Запускаем установку, на 3-м шаге активируем неактивные пункты.

      OpenVPN-channels-pass-003.jpg

      Следующий шаг - путь для установки. Чтобы облегчить себе дальнейшую жизнь, устанавливаем в корень диска С.

      OpenVPN-channels-pass-004.jpg

      В процессе установки в систему инсталлируется виртуальный сетевой адаптер TAP-Win32 Adapter V9 и, соответственно, драйвер к нему. Этому интерфейсу программа OpenVPN как раз и будет назначать IP адрес и маску виртуальной сети OpenVPN. В нашем случае ему назначен адрес 10.10.10.1с маской 255.255.255.0 на сервере С_ОФ1 и 10.10.10.2 с аналогичной маской на клиенте С_ОФ2.

      OpenVPN-channels-pass-005.jpg

      Переименуем его в "VPN"

      OpenVPN-channels-pass-020.jpg


      В директории "C:\OpenVPN" следует сразу же создать дополнительно папку ssl (здесь мы будем хранить ключи аутентификации) папку ccd (здесь будут находится конфигурация настроек сервера для клиента).

      В папке easy-rsa создаем файл vars.bat, данный пакетный файл будет задавать переменные для сеанса генерации сертификатов, в той части что касается организации и расположения заполняем своими данными.

      Запускаем командную строку от имени администратора.

      OpenVPN-channels-pass-006.jpg


      Переходим по пути C:\OpenVPN\easy-rsa, набрав для перехода в командной строке команду

      Запускаем vars.bat:

      OpenVPN-channels-pass-007.jpg

      Далее запускаем clean-all.bat:

      OpenVPN-channels-pass-008.jpg

      Теперь запускаем build-ca.bat. Так как вся информация о сервере у нас уже заполнена, все оставляем без изменений:

      OpenVPN-channels-pass-009.jpg

      после этого у нас в папке ssl появится два файла ca.crt и ca.key.

      Запускаем build-dh.bat:

      OpenVPN-channels-pass-010.jpg

      в результате у нас в папке ssl появится файл dh1024.pem.

      Создаем серверный ключ, для этого вводим команду:

      где "ServerVPN" это название нащего VPN сервера, как в моем случае,

      Важно! Указываем параметр "commonname" - пишем имя нашего VPN сервера. Все остальные параметры оставляем по умолчанию, на все вопросы отвечаем yes

      OpenVPN-channels-pass-011.jpg

      в результате у нас в папке ssl появятся файлы ServerVPN.crt, ServerVPN.csr, ServerVPN.key.

      Приступаем к формированию клиентских ключей.

      где "UserVPN_1" имя нашего клиента.

      Важно! Указываем параметр "commonname" - пишем имя нашего VPN клиента(UserVPN_1). Все остальные параметры оставляем по умолчанию, на все вопросы отвечаем yes

      OpenVPN-channels-pass-012.jpg

      В результате у нас в папке ssl появятся файлы UserVPN_1.crt, UserVPN_1.csr, UserVPN_1.key.

      Если у вас несколько клиентов, то повторяем формирование ключей; не забывая каждому клиенту присваивать свои имена

      Генерация ключа tls-auth (ta.key) для аутентификации пакетов, для этого переходим в корневую папку OpenVPN:

      и выполняем команду:

      в результате в папке ssl плучим файл ta.key.

      Приступаем к созданию конфига сервера. В папке config создаем файл OpenVPN.ovpn:

      В папке ccd создаем файл без расширения и называем его точно, как клиента UserVPN_1, открываем его блокнотом и пишем следующее:

      Создаем конфиг клиента.

      Устанавливаем на клиенте OpenVPN, предаём ему ca.crt, UserVPN_1.crt, UserVPN_1.key, ta.key.

      Настраиваем файрволы и антивирусы на клиенте и на сервере для беспрепятственного прохождения пакетов. Описывать не буду все зависит от установленных антивирусов и файрволов.

      OpenVPN-channels-pass-013.jpg

      После всего этого запускаем наш сервер и клиент.

      Если все правильно сделали наш сервер получит IP 10.10.10.1 и подключится к нему клиент и получит IP 10.10.10.2 . И так подключение у нас состоялось теперь сервер и клиент пингуют друг друга по IP нашей VPN сети, то есть 10.10.10.1 и 10.10.10.2.

      Для того чтобы пинг шел по внутренним адресам наших С_ОФ1 и С_ОФ2 нужно включить службу Маршрутизации и удаленного доступа.

      image016.jpg


      Hужно зайти в свойства службы, настроить ее на автоматическое включение и запустить.

      OpenVPN-channels-pass-015.jpg

      После этого мы сможем пинговать внутренние IP сервера и клиента (172.17.10.10 клиент и 192.168.0.100 сервер).

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

      При этом все сети работают в штатном режиме. Лично меня этот крест раздражает и иногда сбивает с толку.

      Есть второй способ как сделать видимыми внутренние IP сетей наших сервера и клиента.

      Для этого заходим в реестр, открываем ветку реестра:

      Находим параметр и меняем значение: IPEnableRouter типа REG_DWORD значение 1.

      OpenVPN-channels-pass-017.jpg

      Не забываем перезагрузить машину, чтобы настройки вступили в силу!

      Это нужно проделать и на сервере, и на клиенте.

      Итак мы пингуем наши сети по внутренним IP, а так как у нас и сервер и клиент для своих сетей являются шлюзами, то и машины из сети 1 могут видеть машины из сети 2 и наоборот. то есть Пользователь С_ОФ1(192.168.0.50) может видеть расшаренные папки Пользователя С_ОФ2 (172.17.10.50) и наоборот.

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

      Пример для С_ОФ1:

      Пример для С_ОФ2:

      в моем случае этого не понадобилось.

      Для автоматического запуска сервера и клиента нам нужно включить службу OpenVPN Service

      OpenVPN-channels-pass-018.jpg

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

      Дополнительная защита

      Как известно в OpenVPN есть возможность аутентификации по сертификатам, как описано выше, а так же по логину и паролю, но можно еще и объединить их вместе. Насколько мне известно только в Linux есть возможность штатными средствами настроить аутентификацию по логину и паролю, но в Windows это тоже можно решить. Для этого в папке config создаем файл auth.vbs и пишем в него следующее

      Так же в папке config содаем файл Users.pw туда пише логин и пароль нашего клиента

      Если несколько клиентов то:

      Дальше нужно в конфиге клиента прописать строку auth-user-pass, теперь когда клиент будет подключаться к серверу у него будет выплывать окно авторизации где нужно ввести логин и пароль, который вы назначили ему в Users.pw,их нужно будет сообщить клиенту.

      OpenVPN-channels-pass-019.jpg

      У меня настроено что имя пользователь(логин) соответствует имени клиента в сертификате, то есть UserVPN_1. но можно задать и другое имя отличное от имени в сертификате, для этого нужно смотреть настройки в auth.vbs.

      ' открываем переменную окружения common_name (это CN предъявленного клиентом сертификата)
      ' и сравниваем её с введенным именем пользователя.
      ' если это сравнение не нужно, то следующие 2 строки удалить или закомменировать

      CurrentCommonName = CreateObject("WscrIPt.Shell").ExpandEnvironmentStrings("%common_name%")
      if UCase(CurrentCommonName) <> UCase(UserName) then WScrIPt.Quit(1)
      WScrIPt.Echo "Debug: CurrentCommonName alert alert-bq"> Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

      Читайте также: