С Linux iptables, действительно ли возможно зарегистрировать процесс/название команды, который инициирует исходящее соединение?

Я хотел бы отслеживать процессы, которые инициируют исходящие соединения на рабочем столе Linux. Лучшее, которое я могу придумать, является этим:

iptables -A OUTPUT -m state --state NEW -j LOG --log-uid

Это регистрирует uid/gid, который инициирует соединение, но не процесс/название команды или даже pid, Если я мог бы просто получить pid, я мог бы, вероятно, сделать на скорую руку сценарий, который вытягивает имя процесса, когда журнал записан, но это походит, который даже не возможен.

Идеально я также хотел бы зарегистрировать процессы, которые принимают входящие соединения также.

Какие-либо идеи, как это могло бы быть возможно с iptables [или что-либо еще] на поле Linux?

27
задан 07.04.2009, 23:08

3 ответа

Вы могли записать программу для контроля/proc/net/tcp, вывод которого похож на это:

obi-wan ~ # cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847458 1 e6060560 300 0 0 2 -1
   1: 00000000:04D2 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847477 1 f2e64da0 300 0 0 2 -1
   2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7109 1 f2e65ac0 300 0 0 2 -1
   3: 0100007F:177A 00000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 4864457 1 d2726540 300 0 0 2 -1
   4: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847462 1 e60609c0 300 0 0 2 -1
   5: 6B00A8C0:0016 30F4B5CA:C3AB 01 00000044:00000000 01:00000031 00000000     0        0 4982752 3 f2e64940 55 4 0 2 -1
   6: 0100007F:B143 0100007F:BC5E 01 00000000:00000000 00:00000000 00000000  1000        0 2130283 1 d59cce40 21 4 1 2 -1
   7: 0100007F:BC5E 0100007F:B143 01 00000000:00000000 00:00000000 00000000  1000        0 2130285 1 d59cd2a0 21 4 0 2 -1
   8: 6B00A8C0:0016 3276C35B:8E11 01 00000000:00000000 02:000ADAB1 00000000     0        0 4982629 2 d2727260 40 4 8 2 2
   9: 6B00A8C0:0016 6500A8C0:DD5D 01 00000538:00000000 01:00000029 00000000     0        0 4864416 5 e6061b40 42 12 27 3 -1

Можно затем связать открытые порты с inodes, который может быть связан назад с процессами и дескрипторами файлов путем выполнения readlink на дескрипторах файлов, перечисленных для каждого процесса:

obi-wan ~ # readlink /proc/28850/fd/3
socket:[4847458]

Посмотрите здесь, что inode 4847458 соответствует первому сокету tcp в списке выше. Вывод netstat-tapn проверяет это для меня (и вспомните что 0x50 == 80):

obi-wan ~ # netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     28850/cherokee-work

Когда программа мониторинга замечает изменение в/proc/net/tcp, проанализируйте данные и определите, является ли изменение недавно открытым сокетом. Затем Вы могли просто перечислить все дескрипторы файлов для каждого процесса, перечисленного в/proc, делая readlink на каждом на найти соответствие inode. После того как Вы находите, что, у Вас есть pid владения, от которого можно получить что-либо еще, что Вы могли бы хотеть, особенно если у Вас есть процесс, считающий на.

Если Вам не нужно Ваше уведомление, чтобы быть мгновенными, то Ваша программа мониторинга могла использовать медленный опрос (возможно, период 50 мс или 100 мс или даже 1 000 мс).

7
ответ дан 07.12.2019, 09:29

Вы хотите модуль соответствия владельца, который только работает над ВЫХОДНОЙ цепочкой (и возможно PREROUTING...?). Прочитайте документы, но это будет работать что-то вроде этого:

iptables --append OUTPUT -m owner --cmd-owner "$app" \
--jump LOG --log-level DEBUG --log-prefix "OUTPUT $app packet died: "
9
ответ дан 07.12.2019, 09:29

Ничто, чтобы сделать с iptables или входом; но вот "вершина" как интерфейс, который опрашивает/proc/каталог и отображает пропускную способность на программу/pid:

http://sourceforge.net/projects/nethogs

"NetHogs является маленьким 'сетевым лучшим' инструментом. Вместо того, чтобы ломать трафик на протокол или на подсеть, как большинство инструментов делают, это группирует пропускную способность процессом. NetHogs не полагается на специальный модуль ядра, который будет загружен".

5
ответ дан 07.12.2019, 09:29

Теги

Похожие вопросы