Сторожевой мониторинг доменного сокета UNIX, инициирующий события для определенного содержимого - PullRequest
4 голосов
/ 06 декабря 2011

Я на встроенной платформе (архитектура mipsel, ядро ​​Linux 2.6), где мне нужно отслеживать IPC между двумя процессами с закрытым исходным кодом (прошивка маршрутизатора), чтобы реагировать на определенное событие (динамическое изменение IP из-за переподключения DSL),До сих пор я узнал через strace , что при изменении IP-адреса демон DSL записывает специальное сообщение в сокет домена UNIX, связанный с конкретным именем файла.Сообщение используется другим демоном.

Теперь вот мое требование: я хочу отслеживать поток данных через этот конкретный сокет домена UNIX и запускать событие (вызывать сценарий оболочки), если обнаруживается определенное сообщение.Я пытался отслеживать имя файла с помощью inotify, но он не работает с файлами сокетов.Я знаю, что могу запускать strace все время, фильтруя его выходные данные и реагируя на изменения в отфильтрованном файле журнала, но это будет слишком тяжелым решением, поскольку strace действительно замедляет работу системы.Я также знаю, что могу просто запросить изменение IP-адреса через cron, но мне нужен сторожевой таймер, а не решение для опроса.И мне интересно узнать, существует ли инструмент, который может специально отслеживать доменные сокеты UNIX и реагировать на конкретные сообщения, проходящие в заранее заданном направлении.Я представляю что-то похожее на inotifywait, то есть инструмент должен дождаться определенного события, а затем выйти, чтобы я мог отреагировать на событие и вернуться к началу запуска инструмента, ожидая следующего события того же типа.

Есть ли какой-нибудь инструмент Linux, способный сделать это?Или есть какой-нибудь простой C-код для автономного двоичного файла, который я мог бы скомпилировать на своей платформе (uClibc, а не glibc)?Я не эксперт C, но могу запустить make-файл.Использование двоичного файла из оболочки не проблема, я достаточно знаю о программировании оболочки.

Ответы [ 2 ]

5 голосов
/ 12 июня 2012

Прошло много времени с тех пор, как я занимался этой темой, и на самом деле не удосужился проверить, что мой знакомый, Денис Власенко , сопровождающий Busybox, предложил мне решение в течение нескольких месяцев.тому назад.Поскольку я только что проверил свою учетную запись здесь в StackOverflow и снова увидел вопрос, позвольте мне поделиться с вами его идеями.Может быть, это кому-нибудь пригодится:

Один относительно легкий взлом, который я могу предложить, заключается в следующем:

Я предполагаю, что у вас есть работающее серверное приложение, которое открыло прослушивание домена Unixсокет (скажем, /tmp/some.socket), и клиентские программы подключаются к нему и общаются с сервером.

  • переименовывает /tmp/some.socket -> /tmp/some.socket1
  • создает новый сокет /tmp / some.socket
  • прослушивать его для новых клиентских подключений
  • для каждого такого подключения, открыть другое подключение к /tmp/some.socket1 к исходному процессу сервера
  • pump data (client<-> сервер) над полученными парами сокетов (код для выполнения очень похож на то, что делает сервер telnetd) до EOF с любой стороны.

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

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

Это похоже на то, что Селада также ответил.Спасибо ему тоже!Ответ Дениса был немного более конкретным.

Я спросил:

Это звучит глупо, да, из-за необходимости перезагрузки, но выполнимо.Я не программист на C, но мне все еще интересно, знаете ли вы инструмент командной строки, который мог бы выполнять для меня сквозную передачу, протоколирование или запуск по событиям.У меня есть один парень из нашего проекта, который может взломать небольшой бинарный файл C для этого, но я не уверен, что ему нравится это делать.Если есть что-то заранее приготовленное, я бы предпочел это.Может ли это быть даже сделано с помощью (комбинации) апплетов BusyBox, может быть?

Денис снова ответил:

Вам нужно создать busybox с CONFIG_FEATURE_UNIX_LOCAL=y.

Запустите следующее в качестве перехватывающего сервера:

 busybox tcpsvd -vvvE local:/tmp/socket 0 ./script.sh

Где script.sh - это простое сквозное соединение с «исходным сервером»:

 #!/bin/sh
 busybox nc -o /tmp/hexdump.$$ local:/tmp/socket1 0

КакНапример, я добавил шестнадцатеричное ведение журнала в файл (опция -o FILE).

Проверьте его, запустив эмулируемый «оригинальный сервер»:

 busybox tcpsvd -vvvE local:/tmp/socket1 0 sh -c 'echo PID:$$'

и подключившись к «перехватывающему серверу»:

 echo Hello world | busybox nc local:/tmp/socket 0

Вы должны увидеть сообщение «PID: 19094» и иметь новый файл /tmp/hexdump.19093 с сохраненными данными.Оба процесса tcpsvd также должны печатать некоторые журналы (они запускаются с -vvv многословием).

Если вам нужна более сложная обработка, замените вызов nc в script.sh пользовательской программой.

0 голосов
/ 29 декабря 2011

Я не думаю, что есть что-то, что позволит вам чисто перехватывать трафик сокетов UNIX.Вот несколько вариантов:

  • Организовать процесс отправителя для подключения к другому сокету, где вы слушаете.Также подключитесь к оригинальной розетке в качестве клиента.Получив данные, обратите внимание на данные, которые вы хотите заметить, а также передайте все в исходный сокет.
  • Мониторинг системы на предмет изменения IP-адреса самостоятельно с помощью сокета netlink (RTM_NEWADDR, RTM_NEWLINK и т. Д....).
  • Запустите ip monitor как внешний процесс и выполните действие, когда он записывает сообщения о добавленных и удаленных IP-адресах на свой стандартный вывод.
...