Мониторинг сокетов в реальном времени с помощью netlink inet_diag

Моя цель — отслеживать сокеты и связывать их с приложениями, которые их создали.
Я знаю о netstat, ss, lsof и т. д., и что они могут перечислить все сокеты с помощью своего приложения.
И я также знаю, что Я могу разобрать /proc/net/tcp, чтобы получить сокеты и связать их с приложениями с помощью /proc/(PID), что именно и делают эти инструменты, или они используют сокеты netlink.

Мои исследования привели меня к статье, в которой объясняется, как получить все сокеты из ядра с помощью netlink. по протоколу inet_diag. Программа пользовательского пространства устанавливает сокет netlink типа inet_diag и отправляет запрос ядру. Ответ состоит из нескольких сообщений, содержащих сокеты и дополнительную информацию.
Это очень удобно, но, к сожалению, ядро ​​отправляет эту информацию только один раз за запрос. Поэтому я должен постоянно «опрашивать».

Дальнейшие исследования привели меня к другой статье, которая отслеживает IP-адреса интерфейсов с сокетами netlink постоянно меняются. Сокет привязывается к многоадресной группе, а затем сообщения считываются из него в бесконечном цикле.

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

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


person BusDriverJoe    schedule 30.08.2013    source источник
comment
Возможно, вам потребуется объяснить, почему такой инструмент, как lsof, не соответствует вашим потребностям.   -  person Greg Hewgill    schedule 31.08.2013
comment
Да, правда, я должен был также упомянуть об этом. Спасибо за комментарий. Я хочу иметь демона пользовательского пространства, который отслеживает сокеты на основе событий (новый сокет, закрытый сокет, я думаю, в основном системные вызовы, связанные с сокетом) и собирает информацию, такую ​​​​как протокол, порты и приложение, которое создало сокет. Может быть, я хочу также собрать полезную нагрузку сокетов. Таким образом, механизм, как в примере с протоколом netlink_route с многоадресными группами, был бы очень удобен. Но из-за отсутствия документации сам не могу разобраться :(   -  person BusDriverJoe    schedule 31.08.2013
comment
Как насчет использования аудита для мониторинга связанных системных вызовов? Отслеживая сокет системный вызов, вы можете узнать порты процесса использует.   -  person yeger    schedule 26.02.2020


Ответы (1)


Вы можете попробовать dtrace, если ни один из упомянутых вами инструментов не соответствует вашим требованиям.

person user650749    schedule 31.08.2013
comment
dtrace может быть возможным решением моей проблемы. Я только что мельком взглянул на него, и кажется, что с его помощью можно извлечь нужную информацию. Есть ли способ запустить это как демон и общаться с другими процессами? Потому что все примеры, которые я видел до сих пор, выводят события с их информацией на консоль. - person BusDriverJoe; 31.08.2013
comment
popen() может помочь использовать его в вашей программе, направляя вывод туда, куда вы хотите. - person JuliandotNut; 09.08.2014