Я хотел бы иметь программу, подобную tcpdump, которая показывает, какая программа отправила конкретный пакет, вместо того, чтобы просто получать номер порта. Это общая проблема, с которой я иногда сталкивался, когда у вас есть старый файл tcpdump, и у вас нет возможности узнать, какая программа отправляла эти данные.
Решение в как я могу определить, какой процесс делает UDP-трафик в Linux? указывает на то, что я могу решить эту проблему с помощью auditd, dTrace, OProfile или SystemTap, но не показывает, как это сделать. Т.е. он не показывает исходный порт программы, вызывающей bind () ..
У меня возникла проблема со странными UDP-пакетами, и поскольку эти порты очень недолговечны, мне потребовалось время, чтобы решить эту проблему. Я решил это, выполнив уродливый хак, похожий на:
while true; date +%s.%N;netstat -panut;done
Так что либо метод лучше, чем этот хак, замена tcpdump, либо способ получить эту информацию из ядра, чтобы я мог исправить tcpdump.
Решение этой проблемы с помощью auditd
sudo auditctl -a exit,always -F arch=b64 -S bind -k BIND
Это заполняет /var/log/audit/audit.log такими строками, как:
type=SYSCALL msg=audit(1292929028.845:3377): arch=c000003e syscall=49 success=yes exit=0 a0=3 a1=808710 a2=10 a3=7fffab28ea10 items=0 ppid=1564 pid=24442 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=4294967295 comm="nc" exe="/bin/nc.openbsd" key="BIND"
type=SOCKADDR msg=audit(1292929028.845:3377): saddr=0200FFFF000000000000000000000000
Затем проанализируйте saddr = 0200xxxx00, где xxxx - номер порта, 0001 - самый низкий, а FFFF - самый высокий.
РЕДАКТИРОВАТЬ: это было задано суперпользователем "отслеживание того, что программы отправляют в сеть", но нет хорошего решения.
информация о процессе, отправляющем пакет (даже если он исходит от локальной машины), недоступна для tcpdump, потому что она не предоставляется интерфейсом захвата пакетов ядра ... ищите "DLT_LINUX_SLL" на http://www.tcpdump.org/pcap3_man.html
изменение этого, безусловно, довольно сложная задача взлома ядра ...
наиболее близким к решению является модуль сопоставления «владельца» iptable, который поддерживает сопоставление пакетов по идентификатору пользователя (также идентификатору процесса в некоторые linux, iirc эта функция была удалена позже) и параметр --log-uid (к сожалению, без --log-pid) цели LOG.
поэтому, когда вы добавляете правило iptables, например: iptables -I OUTPUT -p tcp --syn -j LOG --log-prefix "новое TCP-соединение:" --log-uid
вы получаете журнал (в журнале ядра, он же dmesg
) всех вновь установленных соединений с их исходным портом и идентификатором пользователя, чтобы вы могли получить карту соединений с пользователями без необходимости опрашивать netstat ...
смотреть на этот ответ на идентичный вопрос. Предлагается использовать аудит фреймворк.