Я хотел бы отслеживать процессы, которые инициируют исходящие соединения на рабочем столе Linux. Лучшее, что я могу придумать, это:
iptables -A OUTPUT -m state --state NEW -j LOG --log-uid
Это регистрирует uid / gid, который инициирует соединение, но не имя процесса / команды или даже pid. Если бы я мог просто получить pid, я мог бы, вероятно, создать сценарий, который извлекает имя процесса при записи журнала, но кажется, что это даже невозможно.
В идеале я также хотел бы регистрировать процессы, которые также принимают входящие соединения.
Любые идеи, как это может быть возможно с iptables [или что-нибудь еще] на коробке Linux?
Ответы:
Вы можете написать программу для мониторинга / proc / net / tcp, чей вывод выглядит так:
Затем вы можете связать открытые порты с inode, которые могут быть связаны с процессами и файловыми дескрипторами, выполнив ссылку на чтение файловых дескрипторов, перечисленных для каждого процесса:
Смотрите здесь, что индекс 4847458 соответствует первому сокету tcp в списке выше. Вывод netstat -tapn подтверждает это для меня (и вспомните, что 0x50 == 80):
Когда программа монитора обнаружит изменение в / proc / net / tcp, проанализируйте данные и определите, является ли изменение вновь открытым сокетом. Затем вы можете просто перечислить все файловые дескрипторы для каждого процесса, перечисленного в / proc, выполнив readlink для каждого из них, чтобы найти соответствующий inode. Как только вы обнаружите, что у вас есть pid-владелец, из которого вы можете получить все, что захотите, особенно если у вас есть учет процессов.
Если вам не нужно, чтобы ваше уведомление было мгновенным, тогда ваша программа мониторинга может использовать медленный опрос (возможно, период 50 мс или 100 мс, или даже 1000 мс).
источник
Вы хотите модуль соответствия владельца, который работает только в цепочке OUTPUT (и, возможно, PREROUTING ...?). Прочитайте документы, но это будет работать примерно так:
источник
Ничего общего с iptables или журналированием; но вот интерфейс типа top, который опрашивает каталог / proc / и отображает пропускную способность для каждой программы / pid:
http://sourceforge.net/projects/nethogs
«NetHogs - это небольшой инструмент« net top ». Вместо того, чтобы разбивать трафик по протоколу или подсети, как это делают большинство инструментов, он группирует пропускную способность по процессам. NetHogs не полагается на специальный модуль ядра для загрузки».
источник
Поскольку я смотрю на похожий вопрос, пытаясь ограничить скорость по скайпу, я нашел
хороший способ связать номер порта с pid / cmd, теперь pid-owner / cmd-owner больше не поддерживается напрямую в iptables; Затем вам нужно проанализировать результат, а затем добавить правило iptables в соответствии с портом; естественно, вам понадобится какой-нибудь код очистки после / при выключении / перезагрузке системы и т. д .; сохранить номер порта / с в файл для справки во время очистки
на самом деле хороший ответ на вопрос номера портов
вам может понадобиться настроить элемент grep tcp в соответствии с вашими потребностями
тогда для моих целей было проще всего добавить фильтры tc u32 по номерам портов, записи iptables по номерам портов аналогичные
источник