我正在尝试识别在同一服务器上运行的多个后端微服务之间的网络流量。(它们互相进行一些其余的 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 等方法,但无济于事。谢谢
答案1
iptables -I OUTPUT -m owner --pid-owner 1234 -m state --state NEW -j LOG --log-prefix MSX
这将使用前缀 MSX 记录由 pid 为 1234 的微服务发起的每个连接,以便您可以将其连接与其他微服务区分开来。
您可以将规则管理集成到微服务的初始化脚本中。例如,对于 systemd,将其添加为ExecStartPost
命令$MAINPID
,并有一个相应的ExecStopPost
命令来删除此规则。