1.Tcpdump过滤表达式
1.1 高级过滤语法
- proto[x:y] : 过滤从x字节开始的y字节数。比如ip[2:2]过滤出3、4字节(第一字节从0开始排)
- proto[x:y] & z = 0 : proto[x:y]和z的与操作为0
- proto[x:y] & z !=0 : proto[x:y]和z的与操作不为0
- proto[x:y] & z = z : proto[x:y]和z的与操作为z
- proto[x:y] = z : proto[x:y]等于z
注意:proto代表协议,可以为ip,tcp或者udp
操作符:
- > : greater 大于
- < : lower 小于
- >= : greater or equal 大于或者等于
- <= : lower or equal 小于或者等于
- = : equal 等于
- != : different 不等于
2.报文首部介绍及使用案例
tcpdump的高级过滤技巧可以实现对TCP/UDP/IP报文的过滤,为了使用好此工具, 需要我们对TCP/UDP/IP的报文首部有个清晰的了解。实际上好多网络工具也是基于报文首部进行的操作
2.1 IP报文
IP首部每行四个字节,32bit,ip[0]代表ip首部的第一个字节, 一共 8 bit, 前4bit为Version ,0100 即表示 IPv4,后四位为IHL代表首部的长度,首部最短为20字节,所以第一个字节通常为01000101 ,对应十进制69,,我们可以如下抓取IP 首部中有 Options 的报文
tcpdump -i eth1 'ip[0] > 69'
我们常用的是抓取Protocol字段,IP protocal字段解读
protocol处在IP报文头部的第10个字节
ICMP协议号为1:则 过滤表达式为:ip[9] == 1
TCP协议号为6,则 过滤表达式为:ip[9] == 6
UDP协议号为17,则 过滤表达式为:ip[9] == 17
2.2 TCP报文
如下为TCP报文头格式
Source Port代表tcp报文的源端口,占用两个字节,和IP报文类似,可以用tcp[0:2]表示,即过滤从0字节开始的2字节数,可以用如下抓取一个范围内的端口报文
tcpdump -i eth1 '(tcp[0:2] > 1000 and tcp[0:2] < 2000)' #表示抓取源端口范围为1000-2000内的数据
TCP报文的flag位处在报文的第14个字节,字段如下:
过滤TCP的flag字段
tcpdump -i eth0 'tcp[13] == 2' #过滤SYN报文
tcpdump -i eth0 'tcp[13] == 16' #过滤ACK报文
tcpdump -i eth0 'tcp[13] == 18' #过滤SYN-ACK报文
tcpdump -i eth0 'tcp[13] == 24' #过滤PSH-ACK报文
除了以上方式还可以直接使用tcpflags过滤
tcpdump -i eth0 'tcp[tcpflags] == tcp-ack'
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn'
tcpdump -i eth0 'tcp[tcpflags] == tcp-rst'
tcpdump -i eth0 'tcp[tcpflags] == tcp-push'
tcpdump -i eth0 'tcp[tcpflags] == tcp-fin'
tcpdump -i eth0 'tcp[tcpflags] == tcp-urg'
2.3 UDP报文
可通过如下方式过滤
tcpdump -i eth1 'udp[0:2] == 53' #过滤源端口
tcpdump -i eth1 'udp[2:2] == 53' #过滤目的端口
当然,也可以通过如下方式过滤
tcpdump -i eth1 udp src port 53 #过滤源端口
tcpdump -i eth1 udp dst port 53 #过滤目的端口
更多规则可参考 http://www.packetlevel.ch/html/tcpdumpf.html
参考
http://www.packetlevel.ch/html/tcpdumpf.html
图片均来自于网络