tcpdump是一款经典的抓包工具,下面是选项总结
- n
|
使用IP地址表示目标主机,而不是主机名;使用数字表示端口号,而不是服务名称
|
- i
|
指定要监听的网卡接口。“ -i any”表示抓取所有网卡接口上的数据包
|
- v
|
输出一个稍微详细的信息,例如,显示IP数据包中的TTL和TOS信息
|
- t
|
不打印时间戳
|
- e
|
显示以太网帧头部信息
|
- c
|
仅抓取指定数量的的数据包
|
- x
|
以十六进制数显示数据包的内容,但不显示包中以太网帧的头部信息
|
- X
|
与-x类似,不过还打印每个十六进制字节对应的ASCII字符
|
- XX
|
与-X相同,不过还打印以太网帧的头部信息
|
- s
|
设置装包时的抓取长度,超过指定长度时,抓取到的将是被截断的数据包。4.0以后的版本默认的抓包长度是65535字节,因此基本不用担心抓包的长度了
|
- S
|
以绝对值来显示TCP报文段的序号,而不是相对值
|
- w
|
将tcpdump的输出以特殊的格式定向到某个文件中
|
- r
|
从文件读取数据包信息并显示之
|
除了使用选项之外,tcpdump还支持用表达式来进一步过滤数据包。表达式操作数分为三种:类型(type),方向(dir),和协议(protocol)
类型:解释其后面紧跟着的参数的含义。tcpdump支持的类型包括
-
host(主机名,或IP地址)
-
net(用CIDR方法表示的网络地址)
-
port(端口号)
-
portrange(端口范围),
比如要抓取整个1.2.3.0/24网络上的数据包,可以使用如下的命令:
tcpdump net 1.2.3.0/24
方向:src指定数据包的发送端,dst指定数据包的目的端。比如要抓取进入端口9090的数据包,可以使用如下的命令
tcpdump dst port 9090
协议:指定目标协议。比如要抓取所有ICMP数据包,可以使用如下命令
tcpdump icmp
我们还可以使用逻辑操作符来组织上述操作数以及更复杂的表达式:
-
and(或者&&)
-
or(或者||)
-
not(或者!)
如果表达式比较复杂,还可以用括号给它们分组。不过在使用括号的时候,我们需要用单引号 ' 扩住这部分内容或者使用反斜杠 \ 来对它进行转义,以避免它被shell所解释。比如要抓取来自主机10.0.2.4,目标端口是3389或22的数据包,可以使用如下命令:
tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'
此外,tcpdump还允许直接使用数据包中的部分协议字段的内容来过滤数据包。比如,仅抓取TCP同步报文段,可使用如下命令:
tcpdump 'tcp[13] & 2 != 0'
这是因为tcp头部的第14个字节的第2个位正是同步标志。该命令也可以表示为
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
tcpdump输出的格式不仅与选项有关,还与协议有关,不同协议的输出格式不同。
关于 netstat命令(查看网络状态)
-n
|
使用IP地址表示目标主机,而不是主机名;使用数字表示端口号,而不是服务名称
|
-a
|
显示结果中也包含监听socket
|
-t
|
仅显示tcp连接
|
-r
|
显示路由信息
|
-i
|
显示网卡接口的数据流量
|
-c
|
每隔一秒输出一次
|
-o
|
显示socket定时器(比如保活定时器)的信息
|
-p
|
显示socket所属的进程的pid和名字
|
pidof + 进程名 可以方便地查看进程的pid,在查看服务器id时非常方便