Трассировка сетей со сложной топологией. Выявление NAT


На HackWare.ru уже есть подробная статья о методах и программах трассировки, она называется «Трассировка сетевого маршрута» (кстати, рекомендуется начать знакомство с неё). В этой статье вновь будут затронуты вопросы трассировки. Но суть не столько в новом инструменте или в новом методе, суть в том, что весьма вероятно, что показываемые традиционными инструментами маршруты неправильны.

Чтобы пояснить, что я имею в виду, вот так выглядит типичная трассировка от моего компьютера до хоста SuIP.biz:

Но на самом деле, топология сети, по которой пакет может проходить от моего компьютера до SuIP.biz, выглядит примерно так:

Разница очевидна — в некоторых точках имеется до пяти альтернатив узлов, через которые в действительности пройдёт сетевой пакет.

Всё дело в балансировщиках нагрузки и роутерах с функцией балансировки нагрузки. В результате показываемые традиционными средствами маршруты могут содержать такие ошибки как:

  • пропуск узлов
  • неверные пути (когда два узла, находящиеся в разных маршрутах, показываются как последовательные)

Подробно обьяснение, как это происходит, дано в статье (на английском): https://paris-traceroute.net/about/

Трассировка ECMP

Сети сейчас намного сложнее чем раньше, и может быть множество путей между двумя сетевыми объектами (такими как ваш телефон, ваш ноутбук, какой-то удалённый сервер и т. д.). Этот способ маршрутизации пакетов называется ECMP или Equal-Cost MultiPath и используется для увеличения пропускной способности и надёжности сети.

Запуск обычной трассировки в сети с поддержкой ECMP может вызвать головную боль, поэтому существуют такие инструменты, как paris-traceroute.

Equal-cost multi-path routing

Многопутевая маршрутизация с равными затратами (ECMP) — это стратегия маршрутизации, при которой пересылка пакетов к следующему хопу при единичном пункте назначения может происходить через несколько «лучших путей» которые соединены с начальным узлом и для которых вычислена метрика маршрутизации. Многопутевая маршрутизация может использоваться в сочетании с большинством протоколов маршрутизации, поскольку это решение для каждого хопа ограничено одним маршрутизатором. Это может существенно увеличить пропускную способность посредством балансировки нагрузки трафика по нескольким путям; однако могут возникнуть серьёзные проблемы при его развёртывании на практике.

Дополнительная информация:

Упрощённо говоря, путь пакета из точки A в точку F можно представить следующим образом:

Пакет может пройти по маршруту B-D или C-E.

Обычный traceroute отправляет много пакетов, но не может заставить их все идти по одному и тому же маршруту. Поэтому разные пакеты могут быть отправлены по разным маршрутам и сообщения об истечении срока жизни пакета могут прийти от узлов из разных путей.

То, как могут идти пакеты, показано чёрными стрелками, а путь, который могут показать обычные инструменты маршрутизации, показан красными:


Всё ещё хуже, когда два равнозначных по оценки метрики маршрутов имеют различные длины:


Команда, которая создала Paris-traceroute, изобрела технику, которая использует хеширование потока ECMP для проверки всех возможных путей. Dublin Traceroute делает то, что может сделать Paris-traceroute, плюс ещё немного. 

Одной из таких дополнительных функций является способ обнаружения NAT. Dublin Traceroute подделывает IP-идентификатор в тестовом пакете и анализирует ответы, чтобы обнаружить все встреченные NAT. Это новый алгоритм, которого нет в других решениях по построению карт сетей, несмотря на то, что IP-идентификатор не является новым для задач, связанных с NAT. Например, Paris-traceroute использует IP ID чтобы определить, является ли петля в traceroute следствием устройства NAT, для этого используется IP-идентификатор пакета ответа, объяснение смотрите в статье Стивена Белловина «A technique for Counting NATted Hosts».

Paris-traceroute уже обнаруживает устройства NAT, но на самом деле это совсем другое: Paris-traceroute может сказать вам, является ли переход, который появляется как петля в traceroute, из-за NAT или нет; в то время как Dublin Traceroute может сказать вам, есть ли NAT после данной точки, а также может определить несколько NAT.

Как установить Dublin Traceroute

Dublin Traceroute имеет библиотеку и инструмент командной строки, которые устанавливаются довольно легко. Но также имеется Python версия, которая умеет делать трассировку и дополнительно умеет рисовать графики маршрутов используя полученные данные. Для включения этих функций на вашей системе нужно установить разные зависимости — как это сделано показано ниже.

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

Для установки Dublin Traceroute в Kali Linux выполните команды:

sudo apt install dublin-traceroute
# Установка модуля Python
sudo apt install libtins-dev libpcap-dev libjsoncpp-dev libdublintraceroute-dev python3-tabulate python3-pygraphviz python3-setuptools-scm
git clone https://github.com/insomniacslk/dublin-traceroute
sudo cp -r dublin-traceroute/include/dublintraceroute /usr/include/
sudo pip3 install dublintraceroute

Для установки Dublin Traceroute в BlackArch выполните команды:

sudo pacman -S dublin-traceroute libtins jsoncpp python-tabulate python-pygraphviz python-setuptools-scm
sudo pip3 install dublintraceroute

Как выполнить трассировку многопутевого маршрута

Чтобы выполнить трассировку с поиском всех маршрутов запустите команду вида:

sudo dublin-traceroute ХОСТ

Например, для трассировки мультимаршрутов до хоста suip.biz:

sudo dublin-traceroute suip.biz

Пример вывода (только первые два экрана — информации на самом деле ещё больше):

Вам могут пригодиться следующие опции:


  -N --no-dns                   не пытаться делать обратные DNS преобразования для хопов
  -o --output-file              файл вывода (по умолчанию: trace.json)

Чтобы начертить график маршрутов на основании полученных данных:

python3 -m dublintraceroute plot trace.json

Пример построенных маршрутов показан в начале статьи.

Если вы использовали опцию -o и указали другое имя файла для сохранения результатов, то впишите его вместо trace.json.

Ещё один пример трассировки мальтимаршрутов:

sudo dublin-traceroute w-e-b.site

Поддержка IPv6

Программа Dublin Traceroute написана на C++ и Python. Поддержка IPv6 по утверждению автора программы есть, но (внезапно) в версии, которая написана на языке Go. Исходный код на Go лежит в том же репозитории, что и C++, но нигде не написано, как выполнить установку и насколько полно реализована поддержка.

Возможно, полная поддержка IPv6 будет добавлена позже.

Другие опции Dublin Traceroute вы найдёте на странице: https://kali.tools/?p=5132


Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *