Я пытаюсь определить сетевой трафик между несколькими внутренними микросервисами, работающими на одном сервере. (они делают несколько HTTP-звонков друг другу)
К сожалению, когда я использую tcpdump, строки, которые я вижу для каждого вызова, позволяют мне идентифицировать только «службу назначения» для вызова.
tcpdump -nn -i lo
14:03:52.612985 IP6 ::1.31822 > ::1.9093: Flags [P.], seq 2474698995:2474699366, ack 4107952262, win 697, options [nop,nop,TS val 3238273 ecr 3231488], length 371
14:03:52.616946 IP6 ::1.9093 > ::1.31822: Flags [P.], seq 1:875, ack 371, win 568, options [nop,nop,TS val 3238274 ecr 3238273], length 874
Порт назначения (здесь 9093) стабилен и является тем, на котором работает одна из моих микросервисов. Но исходный порт (31822) является одним из тех «эфемерных / динамических портов», которые произвольно выделяются ОС, поэтому я не знаю, какое приложение сделало вызов.
Есть ли простой способ отследить, какой микросервис является источником этого вызова. Способ связать исходный динамический порт с PID запущенного приложения?
(без изменения самого запущенного приложения я не могу их все контролировать)
вещи, которые я пробовал, такие как netstat, lsof ни к чему не привели. Спасибо
iptables -I OUTPUT -m owner --pid-owner 1234 -m state --state NEW -j LOG --log-prefix MSX
Это будет регистрировать каждое соединение, инициированное микросервисом с pid 1234 с использованием префикса MSX, чтобы вы могли отличить его соединения от других микросервисов.
Вы можете интегрировать управление этими правилами в сценарий инициализации микросервиса. Например, для systemd добавьте это как ExecStartPost
команда с использованием $MAINPID
и иметь соответствующий ExecStopPost
команда, удаляющая это правило.