Что такое tap интерфейс
Виртуальный сетевой интерфейс в linux. TAP vs TUN
Читатели, не нуждающиеся в теоретическом изложении концепции виртуальных сетевый интерфейсов Linux, могут сразу перейти к настройке по ссылкам:
Создаем виртуальный интерфейс в linux вручную
Создавать и удалять интерфейсы, назначать IP и MAC адреса, изменять MTU и многое другое нам помогает утилита ip. Пользоваться ip удобно и легко, но помните, что произведенные изменения будут потеряны после перезагрузки компьютера. Используйте ip в целях тестирования.
Создаем интерфейс типа tun
ip tuntap add dev tun0 mode tun
ip address add 192.168.99.1/30 dev tun0
ip address show tun0
2: tun0:
mtu 1500 qdisc noop state DOWN group default qlen 500
link/none
inet 192.168.99.1/30 scope global tun0
valid_lft forever preferred_lft forever
ip link set dev tun0 master br0
RTNETLINK answers: Invalid argument
Создаем интерфейс типа tap
ip tuntap add dev tap0 mode tap
ip address add 192.168.99.5/30 dev tap0
ip address show tap0
3: tap0:
mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether d6:1c:67:cd:6f:80 brd ff:ff:ff:ff:ff:ff
inet 192.168.99.5/30 scope global tap0
valid_lft forever preferred_lft forever
У нас теперь появился новый виртуальный интерфейс с именем «tap0», у него есть как IP-адрес, так и MAC-адреса. Его также можно пинговать, и на нем также можно запускать слушающие сервисы. Команда, добавляющая интерфейс в бридж уже не выдаст ошибку, потому что это интерфейс, обладающий поддержкой ethernet:
ip link set dev tap0 master br0
Создаем интерфейс типа dummy
ip link add dev dum0 type dummy
ip address add 192.168.99.9/30 dev dum0
ip address show dum0
4: dum0:
mtu 1500 qdisc noop master br0 state DOWN group default qlen 1000
link/ether 1a:37:3b:0f:da:be brd ff:ff:ff:ff:ff:ff
inet 192.168.99.9/30 scope global dum0
valid_lft forever preferred_lft forever
Вы наверняка заметили, что команда для добавления интерфейса изменилась. Ничего необычного. Так написана утилита «ip». Ну и конечно, виртуальный интерфейс типа dummy можно легко добавить в бридж:
ip link set dev dum0 master br0
Создаем виртуальный интерфейс в linux с помощью systemd-networkd
В systemd-networkd за создание интерфейсов отвечают одни конфигурационные файлы, имеющие суффикс «.netdev», а за их настройку другие, имеющие суффикс «.network». Соответственно нам понадобиться в /etc/systemd/network создать по паре конфигурационных файлов для каждого из исследуемых типов интерфейсов
Создаем интерфейс типа tun
Создадим соответственно файлы tun0.netdev с содержимым:
[NetDev]
Name=tun0
Kind=tun
Создаем интерфейс типа tap
Создадим соответственно файлы tap0.netdev с содержимым:
[NetDev]
Name=tap0
Kind=tap
Создаем интерфейс типа dummy
Создадим соответственно файлы dum0.netdev с содержимым:
[NetDev]
Name=dum0
Kind=dummy
Стоит отметить, что если вы планируете маршрутизировать траффик через виртуальные интерфейсы ( а, используя их для цели создания виртуальных частных сетей (VPN), вы точно этого хотите), то в конфигурационный файл в секии «Network» следует добавить диррективу «IPForward=yes».
разница tun / tap, это интерфейсы, которые обрабатывают протоколы или ОС?
Введение в Open vSwitch (OVS)
Мне сложно понять разницу между интерфейсом tap и tun. Я знаю, что это часто задаваемый вопрос, и прошу прощения за это. Я задал те же вопросы о stackoverflow, и кто-то сказал мне попробовать этот форум, поэтому я надеюсь, что я нахожусь в хорошем месте. Более того, меня интересуют только сети, но я не студент или профессионал в области сетевых технологий, поэтому простите меня, если мои вопросы слишком просты для вас.
Я читал, что Tap работает на уровне 2, а tun работает на уровне 3. Я также читал, что Tap используется для соединения, а tun используется для маршрутизации. Я уже слышал такие вещи, как «МАРШРУТИЗАТОРЫ работают на уровне 3» или «МОСТЫ работают на уровне 2»: это имеет смысл для меня, потому что маршрутизаторы управляют протоколами уровня 3, а мосты управляют протоколами уровня 2? но, поскольку tap и tun являются «интерфейсами», это означает, что предложение типа «ИНТЕРФЕЙСЫ работают на уровне 3» имеет смысл, но я не понимаю, что это такое: я имею в виду, что интерфейсы не управляют протоколами (это делает ОС, но не интерфейс), поэтому это звучит как tun interface == tap interface:
Если я создаю два интерфейса крана (с tunctl) с двумя IP-адресами, которые находятся в разных сетях (192.168.2.1/24 и 192.168.3.1/24), то я связываю их с двумя виртуальными машинами kvm (интерфейс одного крана соответствует одной виртуальной машине) и если я включу маршрутизацию на хосте, две мои виртуальные машины смогут обмениваться данными.
Таким образом, интерфейсы Tap также могут использоваться для маршрутизации: в чем разница с tun? может тап это тоже интерфейс tun?
Более того, мне кто-то сказал:
Итак, я изучаю IP-соединение точка-точка и соединение Ethernet, и у меня есть другие вопросы:
Вы можете помочь мне прояснить это?
В существенный разница между TUN и TAP это уровень OSI, на котором они функционируют (это не включая программирование, необходимое для каждого типа устройства):
OpenVPN предоставляет эту информацию.
В системе может быть несколько различных типов сетевых адаптеров.
Интерфейс TAP представляет собой виртуальный адаптер Ethernet. Пакеты, проходящие через виртуальный адаптер, будут в форме кадров Ethernet с MAC-адресами источника и назначения (хотя я думаю, что они могут опустить последовательность проверки кадров, не уверен в этом). Как и в случае с настоящим адаптером Ethernet, ядро будет использовать ARP / ND для преобразования «IP-адреса следующего перехода» в MAC-адрес и будет выполнять фильтрацию MAC-адресов для входящих пакетов. Как и в случае с настоящим адаптером Ethernet, ответвительный интерфейс может (при желании) быть включен как часть моста Ethernet.
Интерфейс TUN представляет собой виртуальный «сырой» адаптер. Пакеты, проходящие через виртуальный адаптер, являются необработанными пакетами из протокола уровня 3 с дополнительным заголовком, указывающим тип пакета и флаги. Ядро не будет пытаться преобразовать IP-адрес следующего перехода в любую форму адреса нижнего уровня.
Русские Блоги
Tun / Tap интерфейс учебник- [Перевод: учебник Tun / Tap интерфейс]
оглавление
Предисловие: обратите внимание, что приведенный здесь код предназначен только для демонстрации. Если вы хотите быть серьезным, вы должны сделать его более надежным и интегрировать с другим кодом. Более того, это описание ни в коем случае не является четкой ссылкой на этот вопрос, а является результатом моих экспериментов. Пожалуйста, сообщайте о любых ошибках или ошибках, которые вы найдете в коде или этой статье. Спасибо.
Ссылка на исходный архив, описанный в статье:simpletun。
Обновление 18/07/2010: благодарственноеЭта статьяТеперь я уже знаю, что последняя версия iproute2 может (наконец-то) создавать устройства tun / tap, хотя до сих пор нет полной документации. Больше нет необходимости устанавливать tunctl (утилиты UML) или OpenVPN для создания устройства tun. Ниже приводится iproute2-2.6.34:
Tun/tap interfacesЭто функция, предоставляемая Linux (и, возможно, другими UNIX-подобными операционными системами), которая может выполнятьuserspace networking, То есть, разрешить программе пространства пользователя просматривать исходный сетевой трафик (на уровне Ethernet или IP) и выполнять любые подобные операции. В этом документе делается попытка объяснить, как работает интерфейс tun / tap в Linux, и приведен пример кода, демонстрирующий их использование.
Принцип работы
Tun / Tap интерфейсыsoftware-only interfaces, Что означает, что они существуют только в ядре, и в отличие от обычных сетевых интерфейсов, у них нет физических аппаратных компонентов (поэтому к ним не подключаются физические «провода»). Когда ядро решает отправить данные по этому интерфейсу (вместо того, чтобы отправлять их в программу пользовательского пространства на интерфейсе), настройка tun / tap аналогична обычному сетевому интерфейсу (конкретные процедуры см. Ниже). Когда программа подключается к интерфейсу tun / tap, она получает специальный файловый дескриптор, из которого можно прочитать данные, отправленные интерфейсом. Аналогичным образом, программа может записывать в этот специальный дескриптор, и данные (которые должны быть правильно отформатированы, как мы увидим) будут использоваться в качестве входных данных для интерфейса tun / tap. Для ядра это выглядит так, будто интерфейс tun / tap получает данные из «провода».
Различие между интерфейсом ответвления и интерфейсом tun заключается в том, что интерфейс ответвления выводит или принимает полный кадр Ethernet, а интерфейс tun выводит или принимает исходный пакет данных IP (а ядро не добавляет заголовок Ethernet). При создании интерфейса используйте флаг, чтобы указать, функционирует ли интерфейс как интерфейс tun или интерфейс касания.
Как только интерфейс tun / tap установлен, его можно использовать как любой другой интерфейс, что означает, что вы можете назначать IP-адреса, анализировать его трафик, создавать правила брандмауэра, устанавливать маршруты к нему и т. Д.
Обладая этими знаниями, давайте попробуем посмотреть, как мы используем интерфейс tun / tap и как его использовать.
Создать виртуальный интерфейс
Код для создания совершенно нового интерфейса и повторного подключения к постоянному интерфейсу практически одинаков, разница в том, что первый должен запускаться от имени пользователя root (точнее, с помощьюCAP_NET_ADMINФункциональные пользователи), и последний может запускаться обычными пользователями при соблюдении определенных условий. Давайте начнем с создания нового интерфейса.
Во-первых, оборудование/dev/net/tunДолжен быть открыт в режиме чтения / записи. Устройство также известно какОборудование для клонирования, Это отправная точка для создания любого виртуального интерфейса TUN / TAP. Операция (как и при любом вызове open ()) возвращает дескриптор файла. Но этого недостаточно, чтобы начать использовать его для связи с интерфейсом.
Основной код, используемый для создания виртуального интерфейса, отображается в дереве исходного кода ядра.Documentation/networking/tuntap.txtФайл. Чтобы изменить его, мы можем написать функцию barebones для создания виртуального интерфейса:
tun_alloc()Функция имеет два параметра:
Программа может использовать следующий код для создания устройства:
Эти дополнительные ioctl () все еще должны запускаться пользователем root. Но теперь у нас есть постоянный интерфейс, принадлежащий конкретному пользователю, поэтому процессы, запущенные таким пользователем, могут успешно подключиться к нему.
Как упоминалось выше, оказывается, что код (повторно), присоединенный к существующему интерфейсу tun / tap, совпадает с кодом, использованным для его создания, иными словами, tun_alloc () можно использовать снова. При этом, чтобы добиться успеха, должны произойти три вещи:
Это происходит, если пользователь выдает его, чтобы указать имя существующего интерфейса, и он является владельцем интерфейса, потому что ядро позволяетTUNSETIFF ioctl () успешно выполнен. В этом случае нет необходимости создавать новый интерфейс, поэтому обычные пользователи могут успешно выполнять операции.
Далее мы попытаемся объяснить, что происходит при вызове ioctl (TUNSETIFF), и как ядро различает запросы выделения для новых интерфейсов и запросы на подключение к существующим интерфейсам:
Вы можете посмотреть код, реализующий описанные выше шаги, в исходных файлах ядра drivers / net / tun.c; важными функциями являютсяtun_attach(),tun_net_init(),tun_set_iff(),*tun_chr_ioctl(); Эта последняя функция также реализует множество доступных ioctl (), включая TUNSETIFF, TUNSETPERSIST, TUNSETOWNER, TUNSETGROUP и т. Д.
В любом случае пользователям без полномочий root не разрешается настраивать интерфейс (т.е. назначать IP-адрес и запускать его), но то же самое верно для любого обычного интерфейса. Если пользователю без полномочий root необходимо выполнить определенные операции, требующие прав доступа root, вы можете использовать обычные методы (suid-двоичная упаковка, sudo и т. Д.).
Это возможный вариант использования (я использовал его):
использование
После такого долгого, но необходимого вступления настало время попробовать его использовать. Поэтому, поскольку это обычный интерфейс, мы можем использовать его так же, как и другой обычный интерфейс. Для наших целей нет никакой разницы между интерфейсами tun и tap: программы, которые создают или подключают к нему, должны знать его тип и ожидать или записывать данные соответственно. Мы создаем постоянный интерфейс и присваиваем ему IP-адрес:
Давайте запустим сетевой анализатор и посмотрим трафик:
Присвоение / 24 IP-адреса интерфейсу создаст маршрут соединения через интерфейс. Модифицируйте эксперимент, чтобы заставить ядро фактически что-то излучать из интерфейса tun (Примечание: ядро
Что такое адаптеры TAP-Windows и почему вашему VPN требуется этот драйвер
Если вы откроете Настройки в Windows 10, вы увидите программу под названием TAP-Windows.
Если вы откроете Диспетчер устройств и развернете Адаптеры, вы также увидите его там.
Что такое адаптеры TAP-Windows
TAP-Windows обеспечивает функциональность виртуального устройства TAP в ОС Windows. Он устанавливается в папку C: \ Program Files \ TAP-Windows и требуется для работы программного обеспечения VPN.
Устройства TAP – это устройства ядра виртуальной сети, полностью поддерживаемые программным обеспечением и не поддерживаемые аппаратными сетевыми адаптерами. Драйверы TAP используются для работы устройств TAP и имеют низкоуровневую поддержку ядра для туннелирования Ethernet.
Вам не нужно устанавливать TAP-окна отдельно, так как ваши установщики VPN включают их и устанавливают автоматически вместе с программным обеспечением VPN.
Драйвер TAP-Windows бывает двух типов:
Адаптеры TAP-Windows в этой системе в настоящее время используются
Если вы видите это сообщение или у вашего программного обеспечения VPN возникают проблемы с запуском, вы можете перезапустить адаптер TAP и посмотреть, поможет ли это. Для этого откройте Панель управления> Центр управления сетями и общим доступом> Нажмите «Изменить параметры адаптера», чтобы открыть «Сетевые подключения».
Если вы хотите удалить, отключить или обновить TAP-Windows, из меню WinX Windows 10, откройте Диспетчер устройств и разверните Адаптеры, вы увидите Адаптер TAP-Windows v9.
Щелкните правой кнопкой мыши на нем, и вам предложат варианты обновить, отключить или удалить драйвер.
В этой системе нет адаптеров TAP-Windows
Если ваше программное обеспечение VPN не находит этот драйвер установленным на вашем компьютере, вы можете получить сообщение «В этом системном сообщении об ошибке отсутствуют адаптеры TAP-Windows». Затем вам нужно будет загрузить его настройки и установить драйвер.
Скачать драйвер адаптера TAP-Windows
Чтобы загрузить файл драйвера TAP-Windows, посетите openvpn.net. Прокрутите вниз, и вы увидите их ссылки для скачивания.
Запустите его установщик. После завершения установки драйвера перезагрузите компьютер и проверьте.
Если ваше Интернет-соединение перестает работать, вы можете удалить этот адаптер и посмотреть, поможет ли это вам. Если это не так, возможно, вам нужно удалить и переустановить последнюю версию этого драйвера заново .
Читать дальше : VPN не работает в Windows 10.
Доступ повышенной проходимости.
Не секрет, что своевременный доступ к информации, в том числе хранящейся внутри корпоративной сети компании, может оказаться решающим фактором успешной работы сотрудников. Речь о виртуальных частных сетях (VPN). Иногда предоставить доступ оказывается не так-то просто.
Доступ всегда и везде.
Обеспечивая удалённый доступ во внутреннюю сеть компании приходится учитывать множество факторов. Среди которых встречается и невозможность установления соединения между клиентом и серверном. Причина может быть проста – системные администраторы гостевой сети, из которой сотрудник фирмы пытается произвести подключение, закрыли возможность всех исходящих соединений, а доступ к веб ресурсам осуществляется через «прозрачный» прокси-сервер. В такой ситуации установить VPN соединение используя стандартные решения типа pptp и IPsec попросту не возможно.
Второй большой неприятностью для любого мобильного пользователя может оказаться банальная потеря(или кража) ноутбука. Излишне объяснять, чем обернётся для компании доступ чужого человека в корпоративную сеть, если нашедшему ноутбук вздумается воспользоваться этой возможностью. Разумеется, мобильные пользователи обязаны (как правило на уровне корпоративного стандарта) не ставить опцию хранения пароля на учётную запись доступа VPN, но… вы много таких пользователей видели? Мне пока не довелось ни одного. Поэтому предпочтительно ввести дополнительные средства безопасности доступа к внутренней сети компании. Другими словами, использовать двухфакторную авторизацию пользователей – программным и аппаратным способом. Речь идёт о ключах eToken, которые могут использоваться для безопасного хранения сертификатов для шифрования и дешифрования данных или авторизации в различных системах.
И последнее (по счёту, но не по важности), что хотелось бы упомянуть – возможность получения доступа не только к файлам на серверах компании, но и к другим ресурсам. Например, к почтовому серверу (во многих компаниях использование внешних соединений по pop3, imap и smtp протоколам запрещено). Проблема может заключаться в том, что почтовый сервер находится, например, вне локальной сети компании. Далее, мы рассмотрим комплексное решение всех обозначенных проблем.
Как мы будем решать задачу.
Мы воспользуемся следующими программными и аппаратными средствами:
• OpenVPN, работающим под Linux, в качестве поставщика защищённого частного канала связи;
• htc и hts программами для организации http тунеля через прокси сервера;
• eToken PRO от компании Alladin.
Вы можете использовать аналогичные ключи любых других производителей, ключ этой компании просто оказался у меня под рукой.
Итак, рассмотрим каждый пункт отдельно.
OpenVPN.
Система OpenVPN [1] выбрана для реализации решения не случайно. Это программное обеспечение весьма активно обновляется разработчиками. OpenVPN позволяет реализовать практически любые задачи по организации VPN каналов.
Среди достоинств системы:
• поддержка практически всех возможных операционных систем — Linux, Windows версий 2000/XP и выше, OpenBSD, FreeBSD, NetBSD, Mac OS X, Solaris;
• возможность использовать все доступные OpenSSL методы шифрования, аутентификации и сертификатов для защиты вашего частного канала;
• возможность создавать целые фермы серверов с балансировкой нагрузки тысяч входящих VPN соединений;
• использование статического ключа для шифрования или систему открытых ключей;
• возможность создавать безопасное подключение типа «мост» (ethernet bridges);
• возможность использования как udp, так и tcp для VPN канала.
И это далеко не полное перечисление функционала OpenVPN. Система постоянно дорабатывается, количество возможностей увеличивается.
Туннель http с использованием htc и hts.
Это маленькие программки одна из которых запускается на сервере, а другая соответственно на клиенте. Они не нуждаются в особых настройках и запускаются простой командной строкой. Ниже мы рассмотрим их более подробно.
eToken ключ.
Для наших целей подойдёт любой аппаратный ключ, предназначенный для безопасного хранения цифровых сертификатов. eToken PRO представляет собой защищенное устройство, предназначенное для строгой аутентификации, безопасного хранения секретных данных, выполнения криптографических вычислений и работы с асимметричными ключами и цифровыми сертификатами. USB-ключ архитектурно реализован как USB карт-ридер с встроенной в него микросхемой (чипом) смарт-карты. Ключ выполнен в виде брелка и напрямую подключается к USB порту компьютера, при этом не требует для своей работы каких-либо дополнительных устройств.
Подобных аппаратных средств на рынке представлено огромное множество и каждый может выбрать наиболее оптимальное для своих целей устройство. Приятная особенность ключей состоит в том, что вы не обязаны использовать их для решения только одной задачи. Один и тот же ключ может позволять производить авторизацию для доступа по Wi-Fi в сеть, для установления VPN соединения и для шифрования данных на жёстком диске.
Вам потребуется только сам ключ и свободно распространяющаяся утилита для работы с ним.
Итак, перейдём к решению поставленной задачи.
Установка OpenVPN сервера.
Воспользуемся Gentoo Linux для установки системы OpenVPN. Но прежде, чем мы приступим к установке, убедимся, что ядро Linux содержит все необходимые модули. Для этого зайдём в конфигуратор нашего ядра и обратим внимание на запись, относящуюся к TUN/TAP драйверам.
Если поддержка установлена, то всё в порядке и можно продолжать. Если нет –установите необходимое значение и перекомпилируйте ядро вашей системы.
Если вы не планируете в дальнейшем использовать аппаратные ключи для двухфакторной аутентификации, то установка самой системы OpenVPN крайне проста и выполняется одной командой.
С текущей версией ebuild’а система установит вам OpenVPN версии 2.0.6 Для использования eToken придётся пройти по дереву портов и принудительно установить более новую версию (на данный момент 2.1_beta14).
# echo net-misc/openvpn >> /etc/portage/package.keywords
# USE=«ssl example» emerge openvpn
Кроме того, может потребоваться установка необходимых дополнительных пакетов. Поэтому я рекомендую на время установки системы просто раскомментировать в вашем /etc/make.conf опцию ACCEPT_KEYWORDS нужной архитектуры (в моём случае это «
x86»), позволив системе установить всё необходимое.
Опция SSL необходима для поддержки OpenSSL, а examples установит примеры конфигурационных файлов OpenVPN. В противном случае, никаких примеров не будет и файлы настроек прийдётся писать, что называется, с чистого листа.
Создание ключей сервера и клиентов.
После того, как скомпилируется система потребуется (для удобства) скопировать примеры конфигурационных файлов в /etc/openvpn и туда же скопировать скрипты, для формирования ключей и сертификатов.
И то, и другое находится в директории /usr/share/openvpn. В поддиректории easy-rsa содержатся скрипты на все случаи жизни, позволяющие создавать:
корневой сертификат (build-ca);
ключ и сертификат сервера (build-key-server);
простые ключи для клиентов (build-key);
ключи для клиентов, защищённые паролем (build-key-pass);
ключи PKCS для необходимой нам возможности использовать eToken (build-key-pkcs12).
Первоначально создадим все необходимые сертификаты и ключи для сервера.
Последняя команда создаёт PKCS12 ключи для пользователя. Где client1, это пример имени пользователя. Команда должна быть выполнена для каждого предполагаемого клиента. Обратите внимание, что при создании ключа вы можете защитить его дополнительно паролем.
Настройка OpenVPN.
Конфигурационный файл OpenVPN (называющийся по-умолчанию server.conf) снабжён весьма подробными комментариями и позволяет без проблем выставить все необходимые настройки практически без использования какой-либо дополнительной документации.
Сначала укажем по какому адресу и на каком порту будет работать наш сервер:
local Х.Х.Х.Х
port 443
Выбор порта не случаен почему, я поясню позже когда будем настраивать клиентскую и серверную часть http тунеля.
Второе, что надо выбрать — по tcp или udp будет работать наш VPN. Для этого есть соответствующая опция:
proto tcp
или
proto udp
Так как мы собираемся сделать возможным доступ через веб прокси сервер гостевой системы, то выберем proto tcp.
Далее, выберите тип сетевого устройства, которое будет использоваться.
dev tun0 – в случае организации обычного VPN, или
dev tap0 – если вы хотите использовать подключение типа «мост».
Используя второй вариант помните о необходимости достаточного пула свободных сетевых адресов в вашей локальной сети, которые будут время от времени заниматься удалёнными пользователями при подключении по VPN.
В секции описания ключей напишем полный путь до нашего ключа:
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
Обратите внимание, что одновременно может использоваться только либо ключ pkcs12, либо «стандартные» ca, cert и key. Если будут выставлены пересекающиеся опции, система откажется запускаться.
Если вы решили использовать обычный VPN, укажите адресное пространство, в котором он будет работать и из которого будет назначать их клиентам.
server 192.168.4.0 255.255.255.0
Если вы собираетесь использовать подключение типа «мост», то потребуется другая опция (параметр server необходимо закомментировать, так как сервер может единовременно работать только в одном качестве):
server-bridge 192.168.1.73 255.255.255.0 192.168.1.61 192.168.1.63
• первый и второй параметры — адрес и маска локальной сетевой карты сервера;
• третий и четвёртый параметры – пул адресов для выдачи внешним клиентам.
Опция, которую мы пропустили
содержит имя файла, в котором будут храниться соответствия клиентов (по именам их ключей) и их внутренним адресам, которые им выдаёт система OpenVPN.
Следующие весьма важные опции указывают, какие адресные пространства будут доступны для клиентов и при подключении автоматически добавятся в таблицу маршрутизации.
push «route 192.168.1.0 255.255.255.0»
push «route Х.Х.Х.Х 255.255.255.255»
Первая опция добавляет возможность использовать нашу локальную сеть, а вторая добавляет один внешний адрес, на котором находится наш почтовый сервер, куда клиенты так же должны иметь доступ при любых обстоятельствах.
Большинство опций, которые следуют дальше необходимы для реализации возможностей, выходящих за рамки данного материала.
Опции
push «dhcp-option DNS 192.168.1.1»
client-to-client
Указывают какой DNS использовать клиентам для преобразования имён в ip адреса внутри нашей локальной сети, а так же позволять ли клиентам VPN взаимодействовать между собой. Это может быть полезно, если есть необходимость обмена файлами между двумя пользователями.
Если вам по какой-то причине необходимо позволить двум независимым клиентам VPN использовать одновременно идентичные сертификаты — раскомментируйте опцию duplicate-cn.
Последнее, на что сейчас стоит обратить внимание – это название файла и путь к нему, куда будет писать журнальный файл OpenVPN, а так же на количество допустимых пользователей системы одновременно.
Настройка шлюза локальной сети.
Если ваш сервер OpenVPN не является основным шлюзом локальной сети – потребуется добавить маршрутизацию для VPN подсети. Так как в моей сети используется Cisco 2621 в качестве основного шлюза, я добавил маршрут на ней следующей командой:
ip route 192.168.4.0 255.255.255.0 192.168.1.73
где первый и второй параметр — адрес и маска виртуальной подсети, а последний — адрес внутреннего интерфейса OpenVPN сервера. (Не забывайте о необходимости включения интерактивного режима на cisco перед вводом команды, а так же записи изменений в память устройства после добавления маршрута.)
Добавление маршрута на Linux шлюзе производится командой:
где первый адрес, это наша виртуальная подсеть, а второй – адрес внутреннего интерфейса сервера OpenVPN.
Если не сделать вышеописанных действий, пакеты из локальной сети не смогут найти «дорогу» до VPN клиента.
Обеспечение доступа к внешнему ресурсу для VPN клиентов.
Для того, чтобы позволить VPN клиентам попадать на наш почтовый сервер, находящийся во внешнем мире относительно нашей рабочей сети, воспользуемся услугами iptables.
Я, создавая правило, не стал указывать допустимые порты соединения по той простой причине, что на внешнем сервере помимо почтового сервиса находятся другие сервисы, работающие на нестандартных портах, которые часто закрыты в гостевых системах для соединения. Вы можете указать, какие порты будут доступны для соединений клиентам VPN.
Кроме того, если правила на вашем файрволе настроены по принципу «всё запретить, нужное разрешить», то не забудьте добавить разрешения на пересылку пакетов с интерфейса tun0.
Запускаем сервер
После того, как были произведены все необходимые настройки, пришло время запустить OpenVPN сервер и посмотреть, что будет в журнальном файле. Обратите внимание, что по-умолчанию скрипт /etc/init.d/openvpn настроен на работу с конфигурационным файлом /etc/openvpn/openvpn.conf, а вовсе не server.conf, который идёт в примерах. Итак, запускаем наш сервер:
В журнальном файле вы должны увидеть нечто вроде:
Так же стоит обратить внимание на вывод команды ifconfig, который должен показать, что в системе появилось новое сетевое устройство tun0.
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:192.168.4.1 P-t-P:192.168.4.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Если устройство не появилось, то внимательно просмотрите журнал и файл конфигурации.
Не забудьте добавить сервис OpenVPN в список автоматически запускаемых, а так же сохранить новые правила iptables в вашем списке.
Установка и настройка клиента OpenVPN.
Теперь, когда первая половина настройки нашей системы завершена, самое время приступить к установке клиентской части программы. Я рассмотрю клиентов для Linux и Windows систем.
Установка Linux VPN клиента.
Клиент на Linux системе может потребоваться вот в каком случае. Допустим, у вас есть удалённые интранет сервера, ресурсы которых вы хотели бы использовать в своей локальной сети. Нет ничего проще! Мы просто подключаем эти системы к нашей VPN и пользуемся. Особенно это может оказаться полезным, если сервер является локальным для какой-нибудь удалённой сети.
Как и в случае с настройкой серверной системы убедитесь в наличии необходимых модулей в ядре.
В Linux клиентская часть от серверной отличается только конфигурационным файлом. Этот файл значительно короче и так же снабжён весьма подробными комментариями.
Первые же параметры указывают сервису OpenVPN, что в системе он является клиентом. Какое сетевое устройство и протокол используются, а так же какой ip адрес у сервера и какой порт используется сервисом OpenVPN.
client
dev tun
proto tcp
remote openvpn.domain.ru 443
Скопируем на клиентскую систему необходимые для работы ключи и сертификаты:
ca.crt, client1.crt, client1.key
и укажем их в конфигурационном файле
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/client1.crt
key /etc/openvpn/easy-rsa/keys/client1.key
На этом настройка нашей клиентской системы завершена и мы можем её использовать. Запускать можно просто переименовав файл из client.conf в openvpn.conf или же командной сторокой
Первый раз я рекомендовал бы запустить из командной строки. Так как протокол будет выводиться непосредственно на экран, это поможет убедиться, что всё нормально.
Если всё прошло нормально, то в конце вывода вы увидите что-то вроде:
Не забудьте добавить сервис в список автоматически запускаемых.
Установка Windows OpenVPN клиента.
OpenVPN в Windows системе обладает графическим интерфейсом (GUI), что значительно упрощает работу с ним для пользователей. По адресу [2] всегда можно найти свежую версию программы. Рекомендую хотя бы первый раз скачать полный инсталяционный пакет (на данный момент это openvpn-2.0.7-gui-1.0.3-install.exe), так как в нём содержатся драйвера для TUN/TAP интерфейсов. В последствии, можно скачивать обновления только самой программы. (Application only по ссылке.)
Среди достоинств и удобств клиента можно выделить:
• отображение иконки программы в системном трее;
• свертывание окна журнала соединения сразу после установления сессии;
• просмотр журнал соединения (вызов из контектстного меню);
• изменение настроек конфигурационного файла (вызов из контекстного меню);
• использование OpenVPN в качестве системного сервиса;
• окно ввода пароля на цифровой сертификат для аутентификации на сервере;
• дополнительная защита программы на операцию соединения (свой собственный пароль);
• изменение пароля на защищённый ключ (в том числе PKCS # 12);
• настройка используемого прокси сервера;
• использование настроек прокси сервера из опций Internet Explorer;
• выполнение скрипта (bat) перед и/или после соединения с сервером OpenVPN;
• индикация статуса соединения в системном трее.
Помните, что в версиях Windows младше 2000/XP OpenVPN клиент работать не будет. Но думаю в наше время такие версии операционных встречаются редко.
После установки клиента в меню программ появляется пункт OpenVPN с богатым выбором:
• ссылка на папку с конфигурационными файлами;
• на папку с примерами;
• программа формирования статического ключа;
• программа создания сертификата и формирования запроса на его подпись;
• собственно программа клиент OpenVPN;
• ссылки на различную документацию.
Конфигурационный файл, как и все предыдущие, снабжен комментариями и ничем не отличается от файла для клиента Linux системы. Разница только в расширении файла. Если в Linux оно было «conf», то в Windows – opvpn. Поэтому описывать настройки смысла не имеет, можно смело заимствовать их из предыдущего примера.
Остановимся только на описании ключей и сертификатов. Как вы помните, мы решили использовать двухфакторную аутентификацию мобильных пользователей. Для этого скопируем на клиентскую систему с серверной только два файла – ca.crt и сертификат соответствующий (по имени) данному клиенту с раширением p12.
Теперь нам необходимо импортировать наш сертификат в имеющийся в нашем расположении Alladin eToken. Для этого скачаем (если ещё не установлено) программное обеспечение по работе с ключом RTE по ссылке [3].
После установки полученной программы, у нас в меню программ появится папка eToken с единственной ссылкой на программу eToken properties.
Рис 1. Программа для работы с ключом.
Вставив наш ключ в USB порт, мы увидим его в окне программы. Перейдя на иконку ключа и выбрав «Дополнительно», введем PIN код для доступа к ключу. Это даст возможность импортировать сертификат.
Рис 2. Окно импорта сертификата.
Если при создании сертификата на сервере был использован пароль (сразу после его подписывания), то здесь нас попросят ввести его еще раз и можете распоряжаться данным сертификатом.
Теперь мы можем убедиться, что сертификат известен нашей Windows системе, а заодно узнать, как к нему будет обращаться клиент OpenVPN. Для этого проследуем в «Панель управления», где выберем «Свойства обозревателя». В этом окне нас интересует только вкладка «Содержание» и кнопка «Сертификаты».
Рис 3. Список доступных сертификатов.
Выделим наш сертфикат и кликнем на «Просмотр», в открывшемся окне выбирем «Состав». Здесь нас интересует поле «Отпечаток», которое скопируем в буфер обмена.
Полученную информацию об отпечатке сертификата внесём в конфигурационный файл нашего OpenVPN клиента.
cryptoapicert «THUMB:ed 38 ac 63 …»
ca ca.crt
Теперь, когда первоначальное конфигурирование клиента завершено пришло время опробовать его в действии. Для этого достаточно в контекстном меню выбрать коннект. Если обращение к eToken прошло корректно, появится окно ввода PIN кода для доступа к ключу.
Рис 4, 5. Удача и поражение.
В случае ошибки, убедитесь, что ключ вставлен в USB порт, а предыдущие шаги выполнены верно.
После подтверждения доступа к ключу в том же окне ввода будет отображаться журнал соединения с сервером. Окно автоматически скроется, как только соединение будет успешно установлено. Вернуться к журналу всегда можно, выбрав в контекстном меню «View log». Осталось попробовать выполнить ping до какого-нибудь из компьютеров удалённой локальной сети и убедиться, что всё работает правильно.
Теперь, когда всё уже настроено и работает пора вернуться к ситуации, когда доступ во внешний мир ограничен веб ресурсами. А для его предоставления используется прозрачное проксирование.
hts и htc.
Как уже было сказано выше, эти две программки легко устанавливаются и ещё проще используются. Суть их работы состоит в том, что первая «слушает» указанный ей порт (в нашем случае это будет 80, доступ к которому есть везде) и в случае инициации соединения создаёт http тунель.
Вторая же наоборот слушает 443 порт и инициирует с удалённой htc соединение через 80 порт.
Установка htc в Gentoo Linux на сервере выполняется простой командой:
Для Windows систем скачать httptunnel можно с страницы проекта по ссылке [4].
Использовать httptunnel весьма и весьма просто. Для запуска на сервере достаточно команды:
Где указан ip адрес и порт, на которые должен быть установлен туннель в случае обращение на порт 80. Команда выполняется без какого-либо вывода на экран. О результатах её выполнения можно узнать только из системного журнала. (Например, /var/log/messages.)
Jun 18 01:47:28 admin hts[27389]: hts (httptunnel) 3.3 started with arguments:
Jun 18 01:47:28 admin hts[27389]: me = hts
Jun 18 01:47:28 admin hts[27389]: device = (null)
Jun 18 01:47:28 admin hts[27389]: port = 80
Jun 18 01:47:28 admin hts[27389]: forward_port = 443
Jun 18 01:47:28 admin hts[27389]: forward_host = Х.Х.Х.Х
Jun 18 01:47:28 admin hts[27389]: content_length = 102400
Jun 18 01:47:28 admin hts[27389]: strict_content_length = 0
Jun 18 01:47:28 admin hts[27389]: use_std = 0
Jun 18 01:47:28 admin hts[27389]: debug_level = 0
Jun 18 01:47:28 admin hts[27389]: pid_filename = (null)
Команда netstat подтверждает нам, что hts действительно работает и «слушает» 80 порт.
Осталось сделать windows скрипт (bat) для запуска клиентской части httptunnel. Этот файл мы создадим в папке c:\program files\openvpn\config и назовём hts_pre.bat. А в сам файл добавим только одну строку:
Где:
-F 443 указывает порт, являющийся итоговым получаетелем.
-P 192.168.1.1:3128 ip адрес и порт прокси сервера гостевой системы.
X.X.X.X:80 собственно адрес серверной части httptunnel.
Выбор места создания и имени файла для скрипта не случаен. Как было уже сказано выше, OpenVPN для Windows умеет выполнять bat файлы до соединения, сразу после соединения и после завершения сессии. Для этого достаточно выполнить всего два условия. Создать bat файл в директории конфигурационных файлов OpenVPN и назвать файл по следующей схеме:
• Назвать файл xxx_pre.bat для выполнения скрипта непосредственно перед соединением.
• Назвать xxx_up.bat для выполнения сразу после установления соединения.
• Назвать ххх_down.bat для завершающего сессию скрипта.
Нас интересует первый тип скрипта. К слову сказать, выполнив команду из нашего bat файла, система не закроет окно и это прийдётся сделать вручную. Это не остановит наш туннель, но избавит от лишнего открытого окна на рабочем столе. Предполагаю, есть средство, позволяющее избежать этого «вечно открытого» окна, но сходу я его не обнаружил (может быть потому что не силён в написании скриптов для Windows). Если вам способ известен – тем лучше.
Как вы заметили, для установления тунеля нам потребовалось знать ip адрес и порт, на которых работает прокси сервер гостевой системы. Эта информация, конечно, не написана крупным шрифтом при входе в здание, но тем не менее (обычно) легко узнаётся у системного администратора. Случаев, когда сисадмин отказывался сообщать параметры прокси мне (возможно пока) не известны.
Теперь наша система полностью настроена и готова работать в практически любых условиях. Этакий максимально защищённый «вседорожник» на просторах интернета!
Насколько мобильным может быть OpenVPN.
Как уже было сказано выше, система OpenVPN позволяет использовать удалённую локальную сеть практически в любых условиях. Но помимо компьютеров (в том числе и ноутбуков), как вам известно, существуют ещё более «мобильные» устройства. Я говорю о коммуникаторах и наладонниках (КПК). В большинстве из них (например, в устройствах на базе Windows Mobile или Symbian) есть либо встроенное средство установления VPN соединения, либо можно установить программное обеспечение стороннего производителя.
Однако, из-за использования в системе OpenVPN TUN/TAP простые средства соединения не подойдут. И найти их для устройств данного класса, увы, пока не возможно. Изыскания в интернете дали только информацию о ведущихся разработках реализации возможности использования OpenVPN. (Сейчас ссылка на информацию об этом есть уже и на главной странице проекта. [5])
Правда, есть одно исключение. Если вы обладатель КПК Sharp Zaurus и давно собирались установить на него Linux, то вполне сможете использовать ваш VPN. Драйвера и необходимый софт для этого можно найти на просторах интернета. Он используется многими людьми. Необходимые файлы можно взять, например, здесь [6].
Заключительное слово.
Устанавливая и настраивая клиент OpenVPN помните, что средства встроенной защиты уже самой Windows программы никто не отменял и ввод ещё одного пароля не будет лишним, если того требует строгая политика информационной безопасности вашей компании. Использование же сертификатов без eToken, как мы помним, так же нам доступно. Например, на домашних компьютерах аппаратные ключи использовать совершенно не обязательно. А вот мобильным пользователям ПК eToken явно не будет лишним. Особенно, если вспомнить, что этот же ключ можно использовать для авторизации в самой Windows системе (и не только).
(с) akeeperКоршунов Алексей.
Впервые опубликовано в журнале «Системный администратор.