Привет, Хабр!
Мы решили обобщить вопросы, связанные с виртуализированным криптографическим шлюзом ViPNet Coordinator VA версии 4.5.1 (далее координатор), которые часто получают сотрудники нашей техподдержки.
В этой статье мы рассмотрим наиболее распространенные схемы внедрения, научимся пользоваться первичными средствами диагностики прохождения трафика, увидим с помощью tcpdump, как устанавливается защищенное соединение, с точки зрения сетевого оборудования.
Этот материал уже был опубликован в журнале "Системный администратор", он был полезен пользователям. Поэтому делимся информацией и с читателями хабра.
Рассчитываем, что у вас уже есть базовые понятия о сетях ViPNet (практический опыт по созданию топологии защищенной сети, файлов первичной инициализации DST, установке и настройке координаторов), но если что-то будет непонятно по тексту, можете задавать вопросы в комментариях.
Для подключения координатора к внешней сети предусмотрено четыре режима работы:
1. «Со статической трансляцией адресов» — подключение через внешний межсетевой экран (устройство) с трансляцией адресов (NAT), на котором возможна настройка статических правил трансляции адресов. Также данный режим можно использовать для прямого подключения к сети Интернет, без использования межсетевого экрана (МЭ).
2. «С динамической трансляцией адресов» — подключение через внешний межсетевой экран (устройство) с трансляцией адресов (NAT), на котором возможна настройка только динамических правил трансляции адресов. Для организации доступа к такому координатору с других узлов используется другой координатор с типом подключения «Со статической трансляцией адресов», с которым данный координатор поддерживает постоянное соединение.
3. «Координатор» — подключение координатора через другой координатор. Сейчас данный режим полностью заменен режимом «с динамической трансляцией адресов и передачей всего трафика через сервер соединений».
4. «Без использования межсетевого экрана» — координатор имеет прямое подключение к внешней сети.
В текущем документе все настройки производятся через командный интерпретатор, так называемую командную строку, имеющую свой особый синтаксис. С помощью командного интерпретатора можно получить доступ ко всем настройкам координатора. Рассмотрим подробнее режимы подключения.
На схеме 1 указаны координаторы, которые располагаются за МЭ, находящимися на границах сетей.
Замечу, что сами координаторы также могут выполнять роль сертифицированного МЭ, но об этом речь пойдет в отдельной статье, а в данной рассмотрим только вопросы организации шифрованного канала.
В данной схеме на одной стороне находится координатор с именем ViPNet Coordinator 1, а с другой — ViPNet Coordinator 2. Между координаторами мы разместим вымышленную сеть, имитирующую Интернет с ip-адресами из диапазона 4.4.4.0/24.
ViPNet Coordinator 1 использует внешний адрес 172.0.0.2, а ViPNet Coordinator 2 — 172.0.1.2.
Для дальнейшего расширения сети у ViPNet Coordinator 1 будет настроена внутренняя сеть в диапазоне 192.168.0.0/24, а у ViPNet Coordinator 2 в диапазоне 192.168.1.0/24.
Чтобы облегчить последующую настройку и введение оборудования в «живую» сеть рекомендуется большинство известных параметров сразу задавать в управляющем приложении: ViPNet Administrator Центр управления Сетью (ЦУС).
Указываем тип используемого МЭ в выпадающем меню «Со статической трансляцией адреса» и ip-адрес доступа к ViPNet Coordinator 1 через МЭ на вкладке настроек МЭ:
На вкладке «адреса во внешних сетях» указываем все адреса, которые будут настроены на сетевых интерфейсах ViPNet Coordinator 1:
Очень важно добиться от администратора МЭ 1 и 2 корректной настройки именно статической трансляции адреса по указанному в ЦУС порту (по умолчанию это протокол udp и порт 55777).
Актуальные версии координаторов поддерживают также установку шифрованного канала по протоколу tcp, однако только между координатором и клиентами (ViPNet Client). Если данный тип подключения актуален для вас, то его также потребуется указать в ЦУС и настроить на МЭ правило статической трансляции указанного порта. Но на текущий момент работа между координаторами возможна только по протоколу udp.
Сформировав и развернув файл первичной инициализации (dst) на координаторе, мы получим конфигурационный файл iplir следующего вида:
Самой первой всегда идет секция собственных настроек. Каждая секция начинается со строки «[id]», далее следуют идентификатор и имя узла, а затем строки с ip-адресами сетевых интерфейсов координатора, которые мы задавали в ЦУС. Их уже настроили в процессе первичной инициализации координатора, они начинаются с «ip=». Сами строки при запуске iplir (командой iplirstart) будут считаны из сетевой подсистемы координатора, т.е. будут отображены только те ip-адреса, которые физически на координаторе присутствуют.
Строка «tunnel» показывает какие ip-адреса туннелирует координатор.
Строка «firewallip» определяет ip-адрес доступа к координатору из внешних сетей. До установки соединений с другими узлами этот адрес берется из справочников, которые были сформированы нами в ЦУС, а после начала работы этот адрес определяется по ответным пакетам от других узлов сети, т.е. может меняться.
«Port» также берется из справочников ЦУС и может быть изменен вручную или автоматически, в определенных сценариях, речь о которых пойдет ниже. Особенностью драйвера iplir является то, что принимать шифрованные пакеты он будет на любом порту, даже отличном от 55777, а отправлять будет всегда с того порта, который указан в данной строке.
«Proxyid» параметр также участвует в определении режима работы узла, при работе в режиме «Со статической трансляцией адресов» должен быть установлен в нулевое значение.
«Usefirewall» принимает значения «on», тогда МЭ используется, если «off» — без МЭ.
«Fixfirewall» как правило в «on» включать не следует, так как этот параметр передается на другие узлы и будет предписывать им отправлять ответные пакеты исключительно на тот адрес, который указан в строке «firewallip», что может привести к частичной или полной недоступности координатора. Использование данного параметра уместно в крайне ограниченном количестве сценариев, когда вы точно уверены в том, что делаете.
«Tcptunnelport» если между координатором и клиентом (пока координаторы между собой умеют работать только по udp) невозможно соединиться по udp-протоколу, то клиент будет пробовать установить соединение по tcp. Функционал обычно востребован при пребывании в аэропорту или, отеле, т.е. в тех местах, где жесткие правила пограничных МЭ могут обеспечивать пропуск только tcp-трафика как правило на порты 80 (http) и 443(https).
«Version» указывает на внутреннюю версию драйвера iplir, версию прошивки можно определить, запустив команду version в командном интерпретаторе.
Таким образом, уже после просмотра только собственной секции координатора мы можем определить, какие параметры он использует: используется МЭ (статика или динамика узнаем совсем скоро), у него два сетевых интерфейса с ip-адресами 172.0.0.2 и 192.168.0.1, а удаленные узлы будут получать к нему доступ по адресу 4.4.4.1. Причем, так как все эти настройки мы задали в ЦУС, то в составе справочников они попадут на другие узлы и нам не нужно будет указывать на них параметры доступа вручную.
Теперь идем в самый низ конфигурационного файла, в секцию [dynamic]:
Тут нас интересует строка «dynamic_proxy», если там «off», то в сочетании «usefirewall» и «proxyid» из собственной секции установлен режим «со статической трансляцией адреса», если «dynamic_proxy»=on, то режим «с динамической».
Параметры ViPNet Coordinator 1 понятны, теперь аналогично проанализируем параметры ViPNet Coordinator 2, для этого нужно найти секцию с его идентификатором и именем:
Строки «id» и «name» уже были рассмотрены ранее, это идентификатор координатора и его имя, заданное в ЦУС, строки, начинающиеся с «ip=» тоже раньше встречались, однако отображение для собственной секции координатора и секция других узлов существенно различаются, в дополнение отображаются не только те реальные адреса, которые мы задали в ЦУС, но и после запятой присвоенные им виртуальные адреса, с которыми мы еще не были ранее знакомы.
Следом идет очень важная строка «accessip», которая определяет адрес, по которому наш координатор будет обращаться к удаленному. Такая строка, а, следовательно, и адрес могут быть только в единственном числе! В ней может быть указан или виртуальный адрес, или один из реальных ip-адресов, физически настроенных на удаленном координаторе.
В нашем примере мы будем работать со всеми узлами только по реальным адресам. Для управления параметром видимости удаленного узла, которая заставит использовать только реальный адрес, необходимо внести изменения в конфигурационный файл iplir:
iplir stop
iplir config
затем найти секцию узла, в которую вносятся изменения, и добавить туда следующую строчку «visibility=real». После чего выйти из конфигурационного файла с сохранением «ctrl + x и y», далее применяем настройки «iplir start».
Теперь секция ViPNet Coordinator 2 должна выглядеть следующим образом:
«Tunnel», «firewallip», «port» и «version» были описаны ранее, однако добавились следующие параметры:
«Accessiplist» — определяет IP-адреса доступа к узлу и их приоритет.
«Proxyid» тут имеет несколько иное значение, чем тот же параметр в собственной секции.
0хfffffffe для режимов «Со статической трансляцией адресов» (наш случай) или «С динамической трансляцией адресов» в случае, если координатор является еще и сервером ip-адресов, ноль для режима «без МЭ» и 16-ричный идентификатор для режимов «Координатор» или «С динамической трансляцией адресов».
«dynamic_timeout» — период опроса (в секундах) ViPNet-координатора, выбранного в качестве межсетевого экрана для данного узла (актуален только для режима «С динамической трансляцией адресов»), чтобы периодическими опросами поддерживать правило пропуска трафика на МЭ, за которым находится координатор.
«Virtualip» — виртуальный адрес, присвоенный узлу.
«Tunnel_local_networs» позволяет вручную отключить туннелирование адресов, входящие в локальную подсеть координатора.
Итого на удаленном узле используется режим работы «Со статической трансляцией адресов», адрес доступа к координатору реальный 172.0.1.2, адрес МЭ 4.4.4.2.
Вся необходимая информация для поверки защищенного соединения с удаленным координатором получена, далее мы можем использовать два варианта: запустить проверку через команду iplir ping <идентификатор узла> или inet ping <accessip узла>.
И в том и в другом случае на удаленный узел пойдет зашифрованный трафик, однако при iplir ping будут отправлены тестовые пакеты на все адреса, указанные в строках «accessiplist», «ip» и «firewallip» по протоколу udp и порту 2046, которые на выходе будут зашифрованы драйвером iplir и инкапсулированы в udp с портом, указанным в строке «port» конфигурационного файла, а параметр «accessip» примет значение в зависимости от того, с какого адреса первым придет ответ. В случае получения ответного пакета будет выведено сообщение, что связь с удаленным узлом установлена, если ответов нет или они пришли, но были заблокированы по какой-либо причине драйвером iplir, будет выведено сообщение о таймауте соединения. Важной особенностью выполнения данной команды является то, что ответ может прийти только с защищенного узла, идентификатор которого мы указали в команде.
При inet ping никакого перебора не будет, пакеты сразу направляются согласно таблице маршрутизации координатора на указанный адрес, затем драйвер инкапсулирует этот пакет в udp и направляет на firewallip удаленного узла. Зато пакеты будут идти до тех пор, пока пользователь не выполнит прерывание данной команды. Результаты выполнения будут сразу же видны на экране, аналогично стандартной утилите ping. Следует отметить, что если при iplir ping мы гарантированно получим ответ только от защищенного узла, то по inet ping нам может ответить любой узел с ip-адресом, указанным в запущенной команде. Так, если видимость удаленного узла сменилась на виртуальную, то пакет с нашего координатора может уйти нешифрованным, так как решение о необходимости его шифрования принимает драйвер iplir на основании загруженных в него адресов доступа защищенных узлов. Таким образом необходимо визуально контролировать, что параметр «accessip» в секции удаленного узла не принял иного значения перед выполнением данной команды.
Кроме отображения непосредственно на экране пакеты также регистрируются в специальных файлах: журналах ip-пакетов. Журналы ведутся по каждому интерфейсу в отдельном файле и их параметры могут быть отредактированы. По умолчанию в журналах регистрируются только заблокированные пакеты, отключить эту настройку невозможно, однако можно включить регистрацию пропущенных пакетов и увеличить сам размер журнала, что позволит хранить в нем информацию за больший временной промежуток. По достижении максимального размера журнала самые старые записи будут удаляться из него.
Включим регистрацию пропущенных пакетов на двух задействованных в нашей схеме сетевых интерфейсах координатора, для этого снова нужно остановить iplir: iplir stop.
Редактируем конфигурационный файл интерфейса eth0: iplir config eth0.
В строке registerall меняем «off» на «on» и выходим с сохранением: «ctrl + x и y».
Аналогичные действия производим для интерфейса eth1.
Запускаем iplir: iplir start.
Теперь на интерфейсах eth0 и eth1 в журналах будут регистрироваться все прошедшие через него пакеты до тех пор, пока размер журнала не достигнет 50 Мбайт.
Запустим для начала iplir ping и дождемся результатов его выполнения на экране:
Связь установлена, теперь посмотрим, как это отображается в журнале.
Вызвать графическое приложение для просмотра журнала ip-пакетов можно командой iplir view:
Тут присутствует большое количество выборок, можно отсортировать журнал по интерфейсу, протоколу, ip-адресу, идентификатору узла и пр. Так как в нашей тестовой сети всего два узла, то пользоваться сортировкой мы пока не будем, а сразу перейдем к поиску «find»:
Красные строчки — заблокированные пакеты, зеленые — пропущенные. Та строка, на которой установлен курсор, ярко зеленая.
Расшифровка колонки «flags» следующая:
< — исходящий пакет;
> — входящий пакет;
C — шифрованный пакет;
B — широковещательный пакет;
D — заблокированный пакет;
T — транзитный пакет;
R — пакет, который будет обработан правилами NAT открытой сети;
N — пакет, который был обработан правилами NAT открытой сети.
В журнале отображаются пакеты из прикладной подсистемы, отправленные до шифрования драйвером, а принятые пакеты уже после расшифровки, поэтому журнал показывает адреса «accessip» и порты, на которые отправляются пакеты именно прикладными системами координатора.
Между двумя красными строчками с заблокированными пакетами видны шифрованные пакеты от 172.0.0.2 на 172.0.1.2 и получены шифрованные ответы на них, udp 2046 как раз проверка связи по команде iplir ping.
Теперь проверим доступность координатора с использованием inet ping.
Предварительно проверим значение «accessip» у ViPNet Coordinator 2 в iplir show config.
Текущий адрес доступа к узлу 172.0.1.2, запускаем на него inet ping.
Визуально пинг идет, проверим журнал ip-пакетов.
Видим отправленные и принятые пакеты по протоколу icmp с 172.0.0.2 на 172.0.1.2.
Опять журнал нам показывает информацию до того момента, как исходный пакет будет инкапсулирован в udp и отправлен далее по сети.
В нашем случае мы видим успешную установку соединения по iplir ping и прохождение пакетов по inet ping, т.е удаленный узел доступен.
Остановимся подробнее на схеме доставки трафика: ViPNet Coordinator 1 при обращении к ViPNet Coordinator 2 будет использовать параметр «accessip» и передавать пакеты в сетевой стек с данным адресом назначения. На выходе драйвер iplir определит по accessip, к какому координатору происходит обращение, зашифрует трафик, заменив в заголовке пакета адрес назначения на firewallip секции удаленного координатора, а в адресе источника будет адрес сетевого интерфейса, с которого уйдет трафик согласно таблице маршрутизации координатора.
В нашем случае в таблице маршрутизации, кроме connected сетей, только один маршрут по умолчанию через МЭ 1: 172.0.0.1, поэтому пакет пойдет сразу на него.
Запустим inet ping 172.0.1.2 и установим снифер трафика между ViPNet Coordinator 1 и МЭ 1:
Видно, что с адреса ViPNet Coordinator 1 172.0.0.2 уходят пакеты по udp 55777 на firewallip ViPNet Coordinator 2: 4.4.4.2.
Теперь снимем трафик после МЭ 1.
После МЭ произошла трансляция адреса источника (NAT) чтобы в интернет не попал «серый» адрес ViPNet Coordinator 1, на который мы бы не получили ответных пакетов. Со стороны кажется, что узлы с адресами 4.4.4.1 и 4.4.4.2 просто обмениваются трафиком по udp 55777.
После МЭ 2 трафик выглядит так:
Т.е. МЭ 2 осуществил статическую трансляцию адреса и перенаправил трафик, пришедший на адрес 4.4.4.2, на адрес ViPNet Coordinator 2 172.0.1.2.
Теперь от ViPNet Coordinator 2 вся цепочка преобразований будет выполнена уже в обратном порядке пока трафик не достигнет ViPNet Coordinator 1.
Первый сценарий успешно реализован, переходим к более сложной схеме.
Режим «С динамической трансляцией адресов»
Рассмотрим еще одну популярную схему, где перед ViPNet Coordinator 1 все также расположен МЭ, осуществляющий статическую трансляцию адреса, а перед ViPNet Coordinator 2 расположен МЭ, осуществляющий динамическую трансляцию адреса, что, кстати, в реальных сетях бывает довольно часто.
При использовании данной схемы необходимо, чтобы на МЭ со статической трансляцией адреса был настроен фиксированный маршрутизируемый ip-адрес, так как если этот адрес будет изменяться в процессе работы, то удаленные узлы потеряют соединение с ViPNet Coordinator 1 и восстановить его будет крайне сложно.
Основная идея заключается в том, что на стороне ViPNet Сoordinator 2, расположенного за МЭ 2, используется специальный режим работы, при котором периодически (по умолчанию раз в 25 секунд) посылаются тестовые запросы на ip-адрес «firewallip» ViPNet Coordinator 1. Данные запросы позволяют поддерживать активной сессию на МЭ 2, так как при отсутствии в ней активности подавляющее большинство подобного оборудования ее закроют в течении довольно короткого времени (обычно от 1 до 5 минут).
ViPNet Coordinator 1 выступает в данном сценарии как «Сервер соединений» для ViPNet Coordinator 2 и будет устанавливать соединения между клиентами и координаторами по кратчайшему пути, если они находятся в разных подсетях и не могут соединиться друг с другом напрямую.
Если же сессию не поддерживать, и она закроется, то со стороны ViPNet Coordinator 1 установить инициативное соединение с ViPNet Coordinator 2 будет невозможно.
Также данный режим имеет возможность следующей настройки: либо направлять весь защищенный трафик через свой сервер соединений, либо с удаленным узлом устанавливается прямое соединение или соединение через его сервер соединений, если настройка отправки трафика не установлена.
Настроим в ЦУС тип МЭ для ViPNet Coordinator 2.
При выборе МЭ «С динамической трансляцией адреса» можно дополнительно указать через какой сетевой интерфейс координатора будет доступен данный МЭ, заполнить сами ip-адреса МЭ (что бывает довольно редко, ведь как минимум внешний адрес динамически изменяется) и в обязательном порядке нужно выбрать координатор для организации соединений с внешними узлами. Именно на него будут отправляться тестовые пакеты с периодом опроса, который указывается в настройках и обычно не требует изменения.
После разворачивания dst на ViPNet Coordinator 2 его конфигурационный файл примет следующий вид: «proxyid» в собственной секции принял значение «0xfffffffe».
В секции «[dynamic]» параметр «dynamic_proxy» стал «on», т.е. специальный режим включился, в качестве координатора, для организации соединений прописался идентификатор ViPNetCoordinator 1.
Давайте теперь убедимся, что специальный режим функционирует корректно, для этого не будем передавать никакого полезного трафика между координаторами, а просто включим прослушивание трафика между МЭ 1 и МЭ 2 на несколько минут:
C адреса 4.4.4.2 каждые 25 секунд посылается пакет на адрес 4.4.4.1, что позволяет держать открытым соединение на МЭ 2. В остальном взаимодействие между координаторами ничем не будет отличаться от предыдущей схемы с режимом «статическая трансляция адреса» на обоих координаторах.
Стоит отметить, что в нашей простейшей схеме, где минимум узлов, при осуществлении динамической трансляции адреса на МЭ 2 даже не изменяется порт источника, а остается изначальный 55777, если же за МЭ будет большое количество узлов, для которых необходимо осуществлять NAT, то вместо 55777 мы можем получить любой порт из диапазона 1024-65535, что однако не будет являться проблемой, на стороне ViPNet Coordinator 1 этот порт зафиксируется в соответствующем параметре и в дальнейшем ответные пакеты будут направляться именно на него.
Режим «Координатор»
Данный режим использовался в устаревших версиях программного обеспечения и в настоящее время оставлен только для обеспечения совместимости с ними. В ближайшее время он будет исключен из числа поддерживаемых.
Вместо этого режима лучше использовать Режим «с динамической трансляцией адресов» и передачей всего трафика через сервер соединений, имеющий меньше ограничений.
Таким образом для каскадных схем, в которых число координаторов в цепочке передачи трафика более двух рекомендуется использовать либо режим «со статической трансляций адреса», если между координаторами нет устройств, осуществляющих динамический NAT или режим «с динамической трансляцией адресов» с направлением всего защищенного трафика через сервер соединений, если устройства с динамическим NAT присутствуют.
Режим «Без использования межсетевого экрана»
Аналогичная ситуация и с данным режимом, его присутствие обусловлено вопросами совместимости с предыдущими версиями и время, когда он исчезнет из числа поддерживаемых, неумолимо приближается.
Вместо него производителем предлагается все тот же универсальный режим «со статической трансляций адреса».
Заключение
Надеюсь, статья будет для вас полезной. Попробовать реализовать все вышеописанное вы можете сами, скачав образ виртуальной машины и два уже сформированный dst файла. Скачать демо-версию
Вопросы и предложения, связанные с внедрением и обслуживанием продуктов ИнфоТеКС, можете задавать в телеграм-канале техподдержки https://t.me/vhd21. Мы отвечаем быстро :)