VyPress Multicast UDP Tunnel

(VMT V0.6beta)

Введение

Так повелось, что в домашних локальных сетях не обходятся без чата: пользователи в сети должны общаться. Существует огромное количество разнообразных программ для чата построенных как по принципу клиент-сервер, так и клиент-клиент без сервера, однако, VyPress-чат получил наибольшее распространение.

VyPress чат не требует серверной части для своей работы, а настройки по умолчанию позволяют использовать программу по принципу “запустил и работает”, что приятно облегчает мозговые усилия большинства недалёких пользователей. Принцип работы VyPress-чата прост: многоадресные посылки, типа разговора в общем канале, смена топика, сообщения на доске объявлений, рассылаются широковещательными (мультикастовыми) UDP-пакетами, персональное общение, получение данных о пользователе и т.п., обеспечивается адресными (юникастовыми) UDP-пакетами. Благодаря такой технологии, трафик общих каналов в сети при одновременном участии в чате 150 человек, не превышает 400 байт в секунду, т.е. трафик очень мал: ни один серверный чат не может похвастаться такой “экономичностью”.

Всё бы хорошо, но технология построения сетей запрещает передачу широковещательных между подсетями, и широковещательные пакеты создаваемые VyPress-чатом обычно погибают на первом же маршрутизаторе (рутере). Если дать возможность каким-либо образом “проникать” широковещательным пакетам из одной подсети в другую, то VyPress-чат станет отличным средством общения между этими двумя подсетями, разумеется, если адресные пакеты в этих сетях уже маршрутизируются, т.е. подсети “видят” друг друга.

Конечно, существуют программы, которые позволяют перебрасывать широковещательные пакеты между двумя подсетями, но не всегда есть возможность настроить подобный софт для работы, например, в 3х и более подсетях вследствие образования петель широковещательных пакетов, универсальности софта для перебрасывания широковещательных пакетов, сложности маршрутизации в подсетях. Наиболее часто проблема пересылки широковещательных пакетов заключается в том, что пакетам надо пройти несколько подсетей, которые не могут маршрутизировать широковещательные пакеты, а подавляющее количество программ маршрутизации реализуют подобную маршрутизацию лишь с одного сетевого интерфейса на другой на одном компьютере, не реализуя туннелей для передачи пакетов в “чужих” подсетях. Назрела необходимость в написании программы, которая смогла бы “поймать” широковещательный пакет в одной подсети и переправить его в другую: так появился VyPress Multicast UDP Tunnel или сокращённо – VMT.

VMT предназначен для передачи широковещательных пакетов VyPress-чата между разными подсетями через произвольное кол-во проходимых маршрутизаторов, т.е. VMT обеспечивает туннелирование широковещательных пакетов.

Принцип работы VMT состоит в следующем: программа принимает широковещательные (мультикастовые) пакеты VyPress-чата на заданном сетевом адаптере, “переделывает” эти пакеты в адресные (юникастовые) и передаёт их другой такой же программе, которая восстанавливает из “туннельного” пакета первоначальный широковещательный и передаёт в свой сегмент локальной сети. Также возможности программы позволяют реализовать пересылку широковещательных пакетов на одном компьютере с несколькими сетевыми интерфейсами без фактического образования туннеля, т.е. когда широковещательные пакеты пересылаются с одного сетевого интерфейса на другой. VMT имеет встроенный drop-фильтр: пакеты от адресов, включённых в drop-фильтр не передаются.

Некоторые сложности возникли при запуске VMT под Windows XP SP2: в этой версии нет возможности формирования UDP-пакетов с произвольными адресами отправителя. В связи с этим, был написан NDIS-драйвер, который обеспечивает работу программы и на этой платформе.

Интерфейс программы сделан на английском языке из соображений запуска VMT на серверах без установленного пакета MUI: пользоваться программой с русским интерфейсом на таком компьютере весьма непросто, если возможно вообще.

Краткий перечень пунктов меню

File

“New” – уничтожает все записи слотов, используется для ввода новой конфигурации.

“Open” или Ctrl+O - вызывает диалог загрузки файла с записями слотов (с расширением *.vmt), сохранённого ранее.

“Save” или Ctrl+S - переписывает ранее загруженный файл с записями слотов.

“Save As” - позволяет сохранить файл с записями слотов, указав имя произвольно.

“Exit” - завершает работу программы; нажатие на окне диалога кнопки закрытия программы приводит к сворачиванию окна в трей, а не к завершению работы.

Network

“Hide” или Ctrl+H – сворачивает окно программы в трей.

“Run” или Ctrl+R - переводит программу в рабочий режим.

“Stop” или Ctrl+P - останавливает программу.

“Setup filter” или Ctrl+F - вызов диалога настройки drop-фильтра (см.ниже).

“Network setup” - вызов диалога настройки сетевых параметров (см.ниже).

About

“Content” – вызов справки по программе.

“Registration” - вызов диалога регистрации программы.

“About program” - вызов окна с общей информацией о программе.

Быстрая настройка программы

Ниже на рисунке показаны элементы управления в окне диалога, в принципе, назначение элементов интуитивно понятно, однако, на всякий ниже в тексте приводится их описание. Помимо описанных в меню сочетаний клавиш, работают ещё кнопки вставки <Ins> и удаления <Del>. Некоторые методы работы с интерфейсом программы приводятся в тексте ниже. Все настройки VMT сохраняет в том же каталоге, что и исполняемый модуль vmt.exe в файле vmt.cfg. В этом же каталоге должен находится файл помощи vmt.mht.

Настройка программы будет показана на следующем примере. Предположим, что есть две локальные подсети, которые “видят” друг друга, но VyPress-чаты работают отдельно в каждой подсети, т.к. широковещательные пакеты не передаются через соединяющий эти две подсети сегмент. Пусть адрес первой подсети будет 192.168.2.0/24, а второй – 192.168.12.0/24, подсеть между ними имеет адрес 172.16.12.0/24. VMT установлен на компьютерах с адресами 192.168.2.200 и 192.168.12.59. Компьютер с адресом 192.168.12.59 одновременно является маршрутизатором и имеет два сетевых интерфейса, адрес второго интерфейса 172.16.12.2. Итак, начинаем объединять VyPress-чаты двух подсетей!

На компьютерах 192.168.200 и 192.168.12.59 надо создать два слота, один из которых будет содержать данные откуда будут поступать широковещательные пакеты, а другой слот будет содержать данные о том, где находится компьютер, принимающий туннельные пакеты. Все скриншоты ниже показывают процесс настройки VMT с “нуля”, т.е. первый запуск программы. В качестве настроек VyPress-чата считаем его настройки по умолчанию: широковещательный адрес 227.0.0.2, порт 8167.

Начнём настройку с компьютера 192.168.2.200.

Двойным щелчком мыши на пустой записи вызываем окно диалога добавления нового слота. Это также можно сделать нажатием кнопки вставки <Ins> или через пункт “Add net” контекстного меню по правой кнопке мыши.

Первым создадим слот, который будет ловить пакеты VyPress-чата в локальной сети. Для этого заполняем форму, как указано ниже.

“Name” – название соединения, которое будет отображаться в таблице, пусть имя этого слота будет “LOCAL”.

Группа настроек “Local interface” указывает, какой сетевой интерфейс будет принимать/передавать пакеты: для компьютера с одним сетевым интерфейсом тут просто надо указать IP-адрес компьютера, для компьютера с несколькими сетевыми интерфейсами надо указать IP-адрес той сетевой карты, через которую “общается” VyPress-чат. В качестве порта указываем тот же порт, что и в настройках VyPress-чата – 8167.

Группа настроек “WAN” указывает адрес пакетов, которые будут приниматься. Если IP-адрес в этом поле меньше 224.0.0.0, то слот считается туннельным и будет настроен на приём туннельных пакетов из другой подсети. В данном случае - это широковещательный слот, адрес и порт которого взяты из настроек VyPress-чата, т.е. 227.0.0.2:8167. В поле “HostID” указывается пароль соединения, который должен совпадать в туннельных слотах, направленных друг на друга. В данном случае, создан слот для широковещательных пакетов и пароль не имеет значения: он игнорируется.

В поле “Rep/TTL” указывается количество повторов пакета для туннельного слота (Rep) или количество проходимых сегментов для широковещательного слота (TTL). В случае широковещательного слота, который сейчас и пытаемся создать, поле “Rep/TTL” трактуется как TTL – максимальное количество сегментов сети, которое может проходить пакет. Для широковещательных пакетов в локальной сети TTL обычно равен 1 (один проходимый сегмент); значение TTL равное 0 в этом поле игнорируется и вместо него применяется TTL равный 1.

Пункт “Enable” разрешает-запрещает работу слота: иногда удобно иметь большой список слотов, а включать лишь некоторые из них, не внося поправки в список. Теперь локальный слот создан, жмём кнопку “Apply” и создаём второй слот - туннельный слот.

Двойным щелчком мыши на пустой записи вызываем окно диалога добавления нового слота. Это также можно сделать нажатием кнопки вставки <Ins> или через пункт “Add net” контекстного меню по правой кнопке мыши.

В поле “Name” указываем название соединения, которое будет отображаться в таблице: если имя слота для приёма широковещательных пакетов было логично назвать “LOCAL”, то здесь логично вписать название той подсети, с которой устанавливается соединение.

Группа настроек “Local interface” указывает, какой сетевой интерфейс будет принимать/передавать туннельные пакеты: для компьютера с одним сетевым интерфейсом тут просто надо указать IP-адрес компьютера, для компьютера с несколькими сетевыми интерфейсами надо указать IP-адрес той сетевой карты, через которую будет вестись туннелирование. В данном случае указаны порт 8168, хотя можно было указать и любой другой свободный порт, например 3000 или 10281. Можно также указать порты “крест-на-крест”: т.е. порт-отправитель будет, например, 8168, а порт получатель – 3000, при этом на другом конце туннеля настройки портов должны быть сделаны “наоборот” – LAN-порт должен быть 3000, а WAN-порт – 8168.

Группа настроек “WAN” указывает туннельный адрес в другой подсети: в поле IP задаётся адрес компьютера, принимающего туннельные пакеты, как выбирается порт, было сказано выше. В поле “HostID” указывается пароль туннельного соединения, который должен совпадать у компьютеров, нацеленных друг на друга.

В поле “Rep/TTL”, для туннельного слота, указывается количество повторов пакета: 0 – нет повторов, шлётся один пакет, 1 – после посылки пакета высылается один повторный и т.д.. Количество повторов пакета увеличивает сетевой трафик, однако, в случае неустойчивой связи, например, с сегментом, подключенным через FSO или Wi-Fi, число “Rep/TTL” полезно увеличивать. Впрочем, количество повторов пакета не может быть большим 9, какое бы число не было записано в этом поле. Всё, туннельный слот создан жмём “Apply”.

Приступим к настройке второго участника моста: компьютер 192.168.12.59.

Создаём слот для приёма широковещательных пакетов из локальной сети. В группе настроек “Local interface” в качестве адреса интерфейса можно указать один из двух адресов 192.168.12.59 или 172.16.12.2, т.к. компьютер имеет 2 сетевых интерфейса, но надо указать адрес 192.168.12.59, т.к. именно этот адрес “смотрит” в ту сторону, где “ходят” широковещательные пакеты VyPress-чата.

Группа настроек “WAN” указывает адрес пакетов, которые будут приниматься. В данном случае - это широковещательный слот, адрес и порт которого взяты из настроек VyPress-чата, т.е. 227.0.0.2:8167. Это поле такое же, как и на компьютере 192.168.2.200, т.к. настройки VyPress-чатов в подсетях одинаковы. Пароль соединения “HostID” в локальном слоте игнорируется.

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

Теперь создаём туннельный слот, направленный на 192.168.2.200.

В поле “Name” указываем название соединения, обычно название той сети, с которой будет работать создаваемы туннельный слот.

Группа настроек “Local interface” указывает, какой сетевой интерфейс будет принимать/передавать туннельные пакеты: в данном случае здесь можно указать как адрес 192.168.12.59, так и адрес второго сетевого адаптера 172.16.12.2, который также маршрутизируется. Для наглядности всё-таки записан адрес 192.168.12.59. Порт указывается исходя из настроек портов 192.168.2.200.

Группа настроек “WAN” указывает адрес компьютера 192.168.2.200, порт выбирается исходя из настроек 192.168.2.200. В поле “HostID” надо не забывать указывать пароль туннельного соединения, иначе никакого соединения не получится.

В поле “Rep/TTL” указываем количество повторов: связь хорошая, значит повторов нет. Туннельный слот создан жмём “Apply”.

Всё, что надо было сделать для создания туннеля - сделано, теперь созданную конфигурацию надо сохранить: для этого надо зайти в меню “File” и щёлкнуть на пункте меню “Save as”. Осталось только перевести программу на компьютерах 192.168.2.200 и 192.168.12.59 в рабочее состояние (двойной клик на надписи “STOPPED” в строке статуса) и всё – VyPress-чаты двух подсетей соединены!

Сетевые настройки (Network setup)

VMT передаёт туннельные пакеты по UDP-протоколу, т.е. отправляет пакет и не заботится о том, дошёл ли пакет до получателя или нет. Во многих случаях это хорошо, т.к. не вызывает траты лишней производительности компьютера и траты сетевого трафика на обеспечениегарантированной доставки пакета. Однако, полезно знать, доходят ли пакеты до получателя вообще, ведь простое пингование или наличие связи через протокол NetBios-а не гарантируют, что порт, протокол или что-то другое, которые используются для образования туннеля, не будут отфильтрованы по пути чьим-либо файрволом. Поэтому в протокол обмена была введена операция пингования.

Пингование в VMT в принципе ничем не отличается от передачи пакета по туннелю: пакет создаётся по тому же принципу, для передачи и приёма используются параметры, заданные в описании слотов. Поэтому можно сказать: если проходят пакеты пинга VMT – туннель работает.

Когда же посылаются пакеты пинга? Сразу после перехода VMT в рабочий режим инициализируется счётчик пинг-посылок: в него записывается значение “Echo duration”. Значение этого параметра говорит о том, сколько секунд VMT может “не волноваться”, если нет пакетов от партнёра по туннелю. Если в течение этого времени ожидания пакет от партнёра приходит, то в счётчик опять записывается время “Echo duration” – VMT считает партнёра активным, т.к. партнёр посылает пакеты.

Во время малой активности в чате бывает так, что проходит довольно продолжительное время, а никто не шлёт в чат сообщений и, следовательно, туннели не обмениваются данными. Как узнать, активен партнёр по туннелю или нет, если он не шлёт никаких данных? Если активность в чате низкая, то часто бывает так, что время “Echo duration” истекает, а данные на порт за это время так и не приходят. В этом случае VMT сам инициирует посылку пинг-запроса. Если партнёр по туннелю “жив”, то он пошлёт ответ и VMT опять “успокоится” на время “Echo duration”. Если же партнёр не ответил на пинг-запрос, то пакеты начинают посылаться партнёру по туннелю с периодом “Ping period”.

Для чего сделано именно так, ведь, казалось бы, достаточно одного параметра? Дело в том, что в реальных домашних сетях частенько используются дешёвые свитчи с малой памятью, а также Wi-Fi оборудование, которые при большом числе активных пользователей, при значительном трафике начинают терять пакеты. Поэтому, в ситуации когда пинг не получил ответа, бывает полезно “пробить” память свитчей или Wi-Fi “очередью” пакетов для восстановления связи. Для таких случаев “Ping period” обычно устанавливают минимальным (1), а “Echo duration” сохраняет желательное время проверки коннекта (обычно 10).

Параметр “Ping try bound” устанавливает количество попыток пинга, после которых в поле статуса появится надпись “Host not answer…”.

Установленный параметр “Driver gate” позволяет восстанавливать широковещательные пакеты после туннелирования с помощью драйвера. Пакеты, пройдя через туннель, должны появится в другой подсети, на другом компьютере, который имеет другой IP-адрес. Т.е. VMT заставляет компьютер, на котором он установлен, генерировать пакеты с чужими данными, или, другими словами, компьютер “подделывает” пакеты, делая их точь-в-точь такими, как те, которые пришли на другом конце туннеля. Заниматься такими вещами программам Windows XP SP2 запрещено, вот поэтому и пришлось написать драйвер: без него VMT под XP SP2 - не работает (поэтому и опцию нельзя поменять, XP SP2 обречена на запуск VMT с драйвером). Однако, в других версиях Windows пользователь может выбрать, как формировать пакеты: драйвером или без него.

Код драйвера встроен в тело программы. Если опция “Driver gate” активна, то в момент запуска программа создаёт файл драйвера vmtdrv.sys в каталоге %Windows%\System32\Drivers и регистрирует его в менеджере сервисов.

“Чёрный список” (Drop filter)

Реализация “чёрного списка” позволяет запретить передачу/приём широковещательных пакетов с нежелательных IP, т.е. реализовать модераторские функции. Проверка на попадание в “чёрный список” ведётся как при приёме, так и при передаче пакетов. Предположим, модератор в сети 192.168.12.0 решает, что клиент с адресом 192.168.2.11 слишком долго ругается матом, что вредно для окружающих. Разумеется, оградить всех от потока брани модератор не в состоянии, однако, модератор легко может запретить прохождение широковещательных пакетов в свой сегмент сети от выбранного IP. Модератор просто заносит противный IP в drop-список VMT, работающего в подсети модератора, больше никто в общем канале не видит сообщений матерщинника.

Ввод нового элемента списка производится двойным кликом мышки на пустом поле, либо нажатием кнопки <Ins> на клавиатуре, либо через контекстное меню по правой кнопке мыши.

Редактирование и удаление элемента списка возможно через контекстное меню, а также по нажатию клавиши “пробел” (редактирование выбранного элемента) и

нажатию клавиши <Del> (удаление выбранного элемента).

Пример реальной реализации

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