2015-04-07 8 views
2

Я хочу переопределить/изменить, как linux обрабатывает запросы ping icmp echo request. Значение Я хочу запустить собственный сервер для ответа на входящие пакеты icmp (echo request или другие).Что обрабатывает ping в linux?

Но для правильной работы, я думаю, мне нужно отключить обработку пакетов pd icmp по умолчанию из linux. Но я не могу понять, как это сделать (я даже не знаю, что обрабатывает запросы icmp ... Ядро? Какой-то код в пользовательском пространстве?) ... Все, что я нахожу, это отбросить эхо-запросы icmp с помощью iptables.

Чтобы понять, позвольте мне объяснить мою цель: Я хочу, чтобы иметь возможность отправлять некоторые данные с помощью ping. (легко) , но мне нужно уметь читать и извлекать эти данные. Кроме того, я хочу иметь возможность ответить специальным эхо-ответом (с некоторыми встроенными данными)

+0

Это должно быть найдено в вашей папке '/ bin'. Но это может зависеть от вашего типа Linux – ryekayo

+0

Привет, я не ищу программу ping.но для кода, который обрабатывает входящие пакеты сообщений эхо-пакетов icmp –

+1

нет .... Я не ищу язык, но для того, что обрабатывает пакеты запроса эхо-сигнала icmp. Я не могу быть более ясным, извините. PS: ядро ​​linux написано на C. И gnu ping также написано на C. –

ответ

5

Чтобы переопределить поведение ядра по умолчанию для ICMP-запроса ECHO (ping), вы можете сделать следующее, не втыкаясь в ядро или написание фильтра.

  • Во-первых: поручить iptables отказаться от запросов ICMP ECHO. Однако они придут на ваш хост и ввести сетевую карту, но они не будут отвечать ядро:

    iptables -A INPUT- p icmp --icmp-type 8 -j DROP

  • Второе: использовать tcpdump нюхать над пакетами ICMP (или написать программу, которая использует libcap, чтобы сделать себе захват). tcpdump имеет опции для отображения данных полезной нагрузки или для записи пакетов с пустыми файлами в файл. Вы можете использовать эту последнюю функцию, чтобы открыть tcpdump с параметром -w из вашей программы, подключить его выход к трубе и прочитать трубу. Таким образом, вы можете получить доступ к входящим эхо-запросам ICMP, даже если они будут отброшены iptables. Из вашей программы вы сможете анализировать данные полезной нагрузки.

    tcpdump -p icmp -i eth0 -s 0 -Xnlt

    (Это для отображения данных в читаемом человека шестнадцатеричном и ASCII на стандартный вывод, измените -X-l параметры в соответствии писать исходные данные в файл/гнездо)

  • Третье: использование raw sockets, ваша программа может отправить настроенный пакет, претендующий на ответ на предыдущий запрос эхо-сигнала ICMP, с требуемой полезной нагрузкой. Этот SO вопрос может иметь больше подсказок для вас в этой области: How to receive ICMP request in C with raw sockets

+1

Я не знал, что можно получить пакеты через сырые сокеты ... но это имеет смысл! Спасибо ! –

1

К сожалению для комментирования на уже ответил вопрос, но я хотел бы добавить (Googlers, может быть), что блокирование ICMP-пакеты с IPTables выиграл 't разрешить вам читать их с помощью сокетов RAW IP, потому что iptables работает на уровне IP. Возможно, вы сможете сделать это с помощью RAW ethernet-сокетов tho, но это объективно худший подход.

Рекомендуемый способ отключить обработку ICMP-пакетов в ядре происходит через интерфейс /proc/sys/net/ipv4/icmp_echo_ignore_all:

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

Это позволит ICMP-пакеты для передачи и быть захвачены, но не будет автоматически отвечать.