![如何在 tcpdump 中根据协议使用复杂的过滤器?](https://linux22.com/image/1183631/%E5%A6%82%E4%BD%95%E5%9C%A8%20tcpdump%20%E4%B8%AD%E6%A0%B9%E6%8D%AE%E5%8D%8F%E8%AE%AE%E4%BD%BF%E7%94%A8%E5%A4%8D%E6%9D%82%E7%9A%84%E8%BF%87%E6%BB%A4%E5%99%A8%EF%BC%9F.png)
wireshark
我可以通过和中的许多协议进行过滤tshark
,如下所示:
sudo tshark -i <My_Interface> -Y '(ip.addr == <My_IP> and isakmp)'
如何在tcpdump
这样的命令中添加协议过滤器?
sudo tcpdump -i any -nn host <My_IP>
答案1
您可以在末尾使用过滤器。这些过滤器称为 Berklee 数据包过滤器或简称 BPF。在您的示例中,您可以这样做:
tcpdump -nn -vvv -e -s 0 -X -c 100 -i eth0 host 1.2.3.4 and \(proto 17 and port 500\)
这将捕获到以下地址的流量:或者来自 1.2.3.4,使用第 3 层协议 17 (UDP)和第 4 层端口 500。您还可以使用友好名称(如果它们存在于和中),/etc/protocols
如下/etc/services
所示:
host 1.2.3.4 and \(proto udp and port isakmp\)
您可以使用更多的 BPF 来限制诸如协议版本之类的内容,以便仅捕获 IPv6(ip6
)或捕获在 TCP 数据包中设置了 SYN 标志的流量(tcp[tcpflags] == tcp-syn
)。
如果你需要一个实时工具,我已经创建了https://tcpdump101.com这将允许您构建 tcpdump 语法和 BPF,以便您可以直接复制和粘贴它。希望它能帮到您。
答案2
经过一些解决方法后,我可以创建自己的过滤器:
whileIFS= read -r line; do if [[ $line =~ 'isakmp' ]]; then echo $line; fi; done < <(sudo tcpdump -i any -nn host <My_IP>)