0

我很好奇 ngrep 是否可以基于端口进行反向匹配?我已经尝试了一些类似的东西:

ngrep -d any -v port 22
interface: any
filter: ( port 22 ) and (ip or ip6)

尽管它说过滤器用于“端口 22”,但它并没有选择任何端口。用谷歌搜索了几天,并没有找到解决方案。任何熟悉 ngrep 的人都可以告诉我这是否可行吗?

4

1 回答 1

2

哇。ngrep 的命令行语法真的一个油腻的 hack。

ngrep 手册页说:

ngrep {various flags} <match expression> <bpf filter>

没有说明 ngrep 如何设法分辨“匹配表达式”的一部分以及“bpf 过滤器”的一部分。

它确定的方式是:

  • 将标志参数之后的第一个 shell 标记(如果存在)作为“匹配表达式”,如果在它之后有任何标记,则将它们全部粘合在一起并在它们之间使用空格并使其成为“bpf 过滤器”;
  • 如果它找到“bpf 过滤器”,则尝试编译它并:
  • 如果成功,则使用它找到的“匹配表达式”和“bpf 过滤器”;
  • 如果失败,假设没有“匹配表达式”,取标志参数后的所有标记,将它们粘合在一起以形成“bpf 过滤器”。

这意味着如果你这样做ngrep port 22,它首先尝试使用“port”作为“匹配表达式”,使用“22”作为“bpf 过滤器”,但由于“22”不是有效的 BPF 过滤器而失败,然后假设没有“匹配表达式”,并且“端口 22”是“bpf 过滤器”,它有效。

但是,如果你这样做ngrep not port 22,它首先会尝试使用“not”作为“匹配表达式”,使用“port 22”作为“bpf 过滤器”,这会成功,所以你最终会使用“not”作为它尝试使用的过滤器grepping 和“端口 22”作为它交给 libpcap 的 BPF 过滤器。

遗憾的是,ngrep无法说“没有匹配表达式,只有一个 BPF 过滤器”,因此您必须ngrep "" not port 22使用空匹配表达式执行诸如 , 之类的操作,以使其将“非端口 22”识别为 BPF 过滤器。

因此,如果您想查看除端口 22 的流量之外的所有流量,请尝试

ngrep -d any "" not port 22

-v影响匹配表达式,而不是BPF 过滤器;这意味着您在问题中给出的命令将匹配进出端口 22的数据包,而不匹配进出端口 22 的数据包。由于您希望空匹配表达式匹配所有数据包,而不是匹配任何数据包,因此您将保留标记出来。-v

于 2015-04-28T01:33:34.650 回答