ngrep - 反向端口结果

ngrep - inverted port results

我很好奇 ngrep 是否可以根据端口进行反向匹配?我尝试了以下方法:

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

虽然它说过滤器适用于 'port 22',但它不会选择任何端口。尝试谷歌搜索了几天,但没有找到解决方案。任何熟悉 ngrep 的人都可以告诉我这是否可行吗?

哇。 ngrep 的命令行语法确实一个油腻的技巧。

ngrep 手册页说:

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

没有说明 ngrep 如何设法分辨 "match expression" 的一部分和 "bpf filter" 的一部分。

它确定的方式是:

  • 将标志参数之后的第一个 shell 标记作为 "match expression" ,如果它后面有任何标记,则将它们全部粘合在一起,并在它们之间留出空格"bpf filter";
  • 如果找到 "bpf filter",尝试编译它并:
  • 如果成功,使用它找到的 "match expression" 和 "bpf filter";
  • 如果失败,假设没有"match expression",取全部 标志参数后的记号,将 它们 粘合在一起,形成 "bpf filter".

这意味着如果您执行 ngrep port 22,它首先会尝试使用 "port" 作为 "match expression" 并使用“22”作为 "bpf filter",但会失败,因为“ 22" 不是有效的 BPF 过滤器,然后假设 不是 一个 "match expression" 并且 "port 22" 是 "bpf filter",这有效。

但是,如果您这样做 ngrep not port 22,它首先会尝试使用 "not" 作为 "match expression" 并使用 "port 22" 作为 "bpf filter",成功,所以你最终得到 "not" 作为它尝试 grepping 的过滤器和 "port 22" 作为它交给 libpcap 的 BPF 过滤器。

可悲的是,ngrep 没有办法 说 "there's no match expression, there's just a BPF filter",所以你必须做一些事情,比如 ngrep "" not port 22,用一个空的匹配表达式来得到它识别 "not port 22" 作为 BPF 过滤器。

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

ngrep -d any "" not port 22

-v 影响匹配表达式,NOT BPF 过滤器;这意味着您在问题中给出的命令将匹配 only 进出端口 22 的数据包,not 数据包 not 到或来自端口 22。由于您希望空匹配表达式匹配 all 数据包,而不是 no 数据包,您将保留-v 标记出来。