Трассировка сетей со сложной топологией. Выявление 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) — это стратегия маршрутизации, при которой пересылка пакетов к следующему хопу при единичном пункте назначения может происходить через несколько «лучших путей» которые соединены с начальным узлом и для которых вычислена метрика маршрутизации. Многопутевая маршрутизация может использоваться в сочетании с большинством протоколов маршрутизации, поскольку это решение для каждого хопа ограничено одним маршрутизатором. Это может существенно увеличить пропускную способность посредством балансировки нагрузки трафика по нескольким путям; однако могут возникнуть серьёзные проблемы при его развёртывании на практике.
Дополнительная информация:
- https://en.wikipedia.org/wiki/Equal-cost_multi-path_routing
- https://en.wikipedia.org/wiki/Multipath_routing
Упрощённо говоря, путь пакета из точки 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
Связанные статьи:
- Трассировка сетевого маршрута (75.6%)
- Как пользоваться Kali Linux в WSL (подсистеме Windows для Linux): подборка лучших программ (ч. 1) (73.3%)
- Утилиты для сбора информации и исследования сети в Windows и Linux (67.5%)
- FinalRecon: простой и быстрый инструмент для сбора информации о сайте, работает и на Windows (62.2%)
- Некоторые приёмы исследования сети (61.1%)
- Tor: от азов до продвинутого уровня (ч. 7): Анонимные сканирования с Nmap, sqlmap и WPScan через Tor (RANDOM - 3%)