Какому процессу принадлежит данный порт (ядро Linux)?

Я пишу простой брандмауэр уровня приложений для Linux (пока ничего особенного, просто мне нужно). Так как модуля владельца для iptables недостаточно, я решил сделать это с помощью libnetfilter_queue. В какой-то момент в моем брандмауэре (приложение C / C ++) мне нужно решить, должен ли пакет с данным портом src / dest быть принят или нет. Теперь встает вопрос. Есть ли простой / быстрый способ узнать, какому процессу принадлежит данный порт?

В основном мне нужна функция

pid_t port2pid(u_int16_t port)

Кажется, единственный способ сделать это в пользовательском пространстве — это проанализировать /proc иерархия. Я не хочу этого делать, поскольку он может быть медленным со всеми временными портами. Ядро должно иметь какой-то порт карты-> процесс в стеке TCP. Можно ли достичь этого, скажем, через специальный модуль ядра? Может быть, кто-то может указать мне на другой способ выполнения той же задачи?

3

Решение

Отвечая на себя.

Файл proc/net/tcp сделан доступным модулем ядра tcp_diag, Это дает легко доступный список всех сокетов TCP и их состояния.

Лучший способ сопоставить сокеты процессам — использовать файловые дескрипторы в /proc/*/fd/*, поскольку сокет может совместно использоваться многими процессами / потоками, которые используют их одновременно. Источник к ss Утилита из пакета iproute2 является хорошим местом для изучения этого материала.

1

Другие решения


По вопросам рекламы [email protected]