我想创建一个具有两个条件的过滤器:-
- 使用网络过滤数据包。
(src net 2a01:111:xxxx::/44)
- 根据 tcp 握手警报消息进行过滤。
(tcp[((tcp[12] & 0xf0) >> 2)] = 0x15)
两个过滤器都可以单独工作,但组合在一起时:-
sudo tcpdump -s 1024 -v -ni any "(src net 2a01:111:xxxx::/44) and (tcp[((tcp[12] & 0xf0) >> 2)] = 0x15)"
,
失败并出现错误:
tcpdump: expression rejects all packets
。
我不确定这两个过滤器的逻辑与如何导致没有数据包被过滤。
答案1
tcpdump
的过滤器语法来自libpcap
,并且libpcap
对 TCP-over-IPv6 的支持不完整。因此,当您使用tcp
关键字作为方括号表达式的协议(如tcp[12]
),它仅适用于 TCP-over-IPv4。
从手册页深处pcap-filter(7)
:
要访问数据包内的数据,请使用以下语法:
proto [ expr : size ]
Proto 是 ether、fddi、tr、wlan、ppp、slip、link、ip、arp、rarp、tcp、udp、icmp、ip6 或 radio 之一,表示索引操作的协议层。(ether、fddi、wlan、tr、ppp、slip 和 link 均指链路层。radio 指添加到某些 802.11 捕获中的“无线电标头”。)注意,tcp、udp等上层协议类型仅适用于IPv4,不适用于IPv6(这个问题以后会修复)。
(重点是我的)