在 Mac OS X 上使用进程 ID 记录网络流量?

在 Mac OS X 上使用进程 ID 记录网络流量?

我想记录 Mac OS X 服务器上的所有网络流量(如 tcpdump 所做的那样),但包括负责的进程的 ID。使用 lsof 只会提供当前连接,而不是过去的连接。

有没有办法做到这一点?

问候,Jochen

答案1

虽然 非常nettop适合查看当前连接的快照,但您也可以使用 来tcpdump收集数据和处理信息。tcpdump使用 选项-k显示捕获流量的元数据。

   -k     Control the display of packet metadata via an optional metadata_arg argument. This is useful when displaying packet saved
          in the pcap-ng file format or with interfaces that support the PKTAP data link type.

          By default, when the metadata_arg optional argument is not  specified,  any  available  packet  metadata  information  is
          printed out.

          The  metadata_arg  argument  controls  the  display of specific packet metadata information using a flag word, where each
          character corresponds to a type of packet metadata as follows:

                 I     interface name (or interface ID)
                 N     process name
                 P     process ID
                 S     service class
                 D     direction
                 C     comment

          This is an Apple modification.

例如显示进程 ID 和进程名称,您可以这样做:

tcpdump -k NP

答案2

我最近也遇到了这个问题。你可以采取的一种方法是同时使用 tcpdump 和上网本并行(每个都在自己的终端 shell 中并排运行),并直观地观察网络流量的表现。

例如,我的防火墙最近检测到了来自 Mac 以太网的可疑网络流量,这些流量来自我不认识的私有子网和一个看起来不寻常的端口 (TCP 7000)。在一个终端 shell 中,我运行了:

$ sudo tcpdump port 7000

在另一个终端 shell 中我运行:

$ sudo nettop -m tcp

当网络流量通过 tcpdump 显示时,它几乎立即也被添加到 nettop 输出中,这表明它是 Apple 的 AirPlay 辅助守护程序,在此示例中以进程 ID(PID)87 运行:

AirPlayXPCHelpe.87

当您尝试捕获网络上的某些异常情况时,这可能不一定实用,但作为起点,可能值得尝试,而不是编写可能更复杂的 DTrace 脚本。

答案3

遗憾的是,实现这一目标的最佳方式是(tcpsnoop(使用 DTrace 执行您所描述的操作)在 Mac OS X 的 dtrace 实现上不起作用。您需要某种应用程序防火墙(小告密者例如),但这更多的是一个桌面/单个用户的事情,而不是您想要在服务器上运行的东西。

这实际上似乎是一个奇怪的要求,您是想建立一个入侵检测系统,还是只是想弄清楚是什么导致了网络访问?

答案4

刚才我第一次走这条路。我发现 DTrace 虽然功能强大,但由于 SIP 系统,现在很难使用。我安装了 Little Snitch 以用于常规防火墙,但我也想开始记录数据。

这里没有人提到 nettop 具有将输出为 CSV 的日志记录模式,而这正是我最终想要的。这似乎与 tcpdump -k NP 方法相当。但是,它不需要我“sudo”该命令。

我想我应该留下这张额外的纸条,希望它对任何人都有用。

相关内容