如何实时解析 tcpdump 流?

如何实时解析 tcpdump 流?

我有一个 debian 安装,其中 OEM 有一堆我无法识别的进程正在运行,我想弄清楚这些进程中是否有任何进程正在拨通。

我跑了sudo tcpdump | grep ^e <ssh_ip>

但管道不断破裂。我是通过 ssh 连接的,grep ^e 是省略我客户端的 ssh ip。有没有办法持续监控出站请求的网络连接?我不知道这件事会打电话回家,或者具体在哪里,我只是怀疑它确实如此,来自与这个问题无关的其他行为。

管道损坏通常意味着连接中断,但我的 ssh 连接很好,这似乎是 tcpdump 需要做的其他事情

答案1

在:

sudo tcpdump | grep ^e <ssh_ip>

首先,^e根据 shell 的不同,它具有不同的含义。

  • 在 Bourne shell 中,是(^的别名,最初呈现得更像是其前身 Thompson shell 中的管道运算符),因此您可以通过管道来执行命令。|^grepe
  • fish3.2 之前的版本中,^用于重定向 stderr( 的缩写2>)。
  • inrc和 导数,^是一种串联运算符,因此grep ^e将变为grepe
  • in zsh -o extendedglob,^是一个否定全局运算符,因此^e将扩展到当前目录中除名为 的文件之外的所有非隐藏文件e
  • csh// tcsh/中,bash仅在行开头且仅在未禁用历史扩展时才特殊。所以不在这里。zsh^
  • 在大多数其他 shell 中,^e将按字面意思传递给grep.

因此,假设后面的 shell 之一,该命令将启动sudo tcpdump,并且grep ^e <ssh_ip>与一个通过管道连接到另一个 shell 的输入的输出同时进行。

参数的语法grepgrep [<options>] <regular-expression> [<files>]([...]表示可选部分)。如果没有文件,grep则 grep 其标准输入。选项以-角色开头。

^e是正则表达式,也是<ssh_ip>用于查找与该正则表达式匹配的行的文件。

作为正则表达式,^e匹配后跟 的行的开头e,以便报告以 开头的行e

在这里,该文件很可能<ssh_ip>不存在,因此grep将立即返回并显示错误。

此时,tcpdump继承自 s 的 stdoutsudo将成为一个损坏的管道,因此第一次tcpdump尝试输出某些内容时,它将收到 SIGPIPE 信号并死亡,或者如果它忽略该信号,它将write()因错误而失败EPIPE。在这里,tcpdump 设法写入错误消息表明它要么忽略该信号并报告其失败write(),要么它有一个处理程序并在终止之前报告其接收情况。

如果您想从 的输出中过滤掉包含 IP 地址的行tcpdump,则需要将grep -Fvw <ssh_ip>where-F和here 捆绑在一起在一个参数中-v-w并且分别表示

  • 匹配F固定字符串而不是正则表达式(用于.匹配文字.而不是像正则表达式中那样匹配任何单个字符)。
  • 重新v匹配:返回匹配的行匹配。
  • 仅匹配订单(例如在其中w找不到<ssh_ip>== )。10.10.10.10210.10.10.109

默认情况下,当 tcpdump 检测到其输出没有发送到终端时,它会恢复为块缓冲,因此,如果您希望在输出到来时立即看到输出,您可能需要-l向 tcpdump 添加选项以重新启用线缓冲。

但无论如何,tcpdump 可以自己过滤数据包。在这里,要排除来自/到给定 IP 地址的数据包,您只需要:

sudo tcpdump not host <ssh_ip>

或者仅过滤来自该 IP 地址的 ssh 流量:

sudo tcpdump 'not (host <ssh_ip> and tcp port ssh)'

(假设 ssh 连接位于默认端口 22)。

这些过滤器(伯克利数据包过滤器,BPF)被编译成传递到内核的二进制过滤器表达式(setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, filter)至少在 Linux 上)。过滤是在那里进行的,因此对于 tcpdump 和系统来说,实际上比 tcpdump 请求所有流量、解码所有流量并将其传递给 grep 的工作量要少。

wireshark,它的命令行界面tshark是一个更先进的流量分析应用程序,您可能也想在这里考虑。它们支持两种类型的过滤器:上面称为 BPF 的过滤器捕获过滤器(通过-f)和一个显示过滤器(通过 传递-Y)使用wireshark自己的过滤器语法和更高级的功能进一步应用于内核返回的数据包。


或递归进入当前工作目录(如果在最新版本的 GNU 实现中给出了-r/选项) 。-Rgrep

相关内容