Intereting Posts
Файлы труб, загруженные с помощью wget в функцию Как мне заставить «sudo ll» работать? Маршрутизировать исходящий трафик на разные шлюзы на основе порта насколько большой должен быть каталог / boot на сервере CentOS 7? Исключая некоторые из команд, которые хранятся в истории bash Насколько неустойчивым является debian sid на практике? Если процессы наследуют среду родителя, зачем нам нужно экспортировать? Как создать шлюз из моей ОС Linux Пакет AUR не может быть построен и установлен – что делать? чтобы проверить, действительно ли ввод действителен для ввода программ C Когда система Linux (Ubuntu) отключается, какие процессы отправляются SIGTERM? isc-dhcp-server не запускается при загрузке Существует ли обратная команда разреза? Перемещение выделенной клип-карты в основную часть при поступлении нового контента Как я могу отобразить содержимое текстового файла в командной строке?

Трассировка пакета в сетевом стеке Linux

Есть ли возможность отслеживать пакет через все сетевые уровни внутри ядра Linux ? Я знаю SystemTap, но я смотрю, есть ли другое (более высокое) решение.

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

Поэтому я ищу что-то, что поможет в этом, инструмент, который может «трассировать пакеты, поступающие на интерфейс X, из abcd», и будет выводить вывод о том, как пакет перемещался по сетевым уровням и где он был сброшен или доставлен или оставлен система. Как strace для пакетов.

Что-нибудь вроде этого существует?

EDIT: добавлено больше деталей для ясности.

Иногда вы можете получать информацию об обход пакета в стек ядра Linux, проверяя счетчики статистики / SNMP, экспортированные ядром в пользовательское пространство. Например, «netstat -s» (или также «cat / proc / net / snmp», который немного легче читать). Например, если была некоторая ошибка из-за неправильного заголовка IPv4, то InHdrErrors будет увеличиваться, а «cat / proc / net / snmp» покажет, что эта ошибка произошла; посмотрите в четвертом столбце, который вы получите при запуске «cat / proc / net / snmp» (который называется «InHdrErrors») Ip: пересылка по умолчаниюTTL InReceives InHdrErrors InAddrErrors

Если вы посмотрите в коде ядра, вы увидите, что в методе ip_recv (), который является обработчиком трафика IPv4, проверяется минимальная длина заголовка или что член версии
в заголовке IPv4 «4», и если это не так, счетчик IPSTATS_MIB_INHDRERRORS увеличивается:

См .: http://lxr.free-electrons.com/source/net/ipv4/ip_input.c#L444 http://lxr.free-electrons.com/source/net/ipv4/ip_input.c#L494 http: //lxr.free-electrons.com/source/include/uapi/linux/snmp.h

И, конечно, есть и другие типы ошибок, а также есть SNMP-счетчики / статистика для обычного обхода пакета в стек ядра Linux, который вы можете изучить при запуске «netstat -s» и / или «cat / proc / net» / SNMP».

Рами Розен