我很好奇 ngrep 是否可以基于端口进行反向匹配?我已经尝试了一些类似的东西:
ngrep -d any -v port 22
interface: any
filter: ( port 22 ) and (ip or ip6)
尽管它说过滤器用于“端口 22”,但它并没有选择任何端口。用谷歌搜索了几天,并没有找到解决方案。任何熟悉 ngrep 的人都可以告诉我这是否可行吗?
哇。ngrep 的命令行语法真的是一个油腻的 hack。
ngrep 手册页说:
ngrep {various flags} <match expression> <bpf filter>
没有说明 ngrep 如何设法分辨“匹配表达式”的一部分以及“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