Ⅰ TCPDUMP 抓包 怎么查看 抓的包的内容
1、tcpmp检测登录linux系统输入tcpmp,如果找不到表示没有安装。也可以用rpm查询。
Ⅱ tcpmp规则过滤抓包及结果筛选查看
1、抓取指定IP地址数据包
2、抓取主机与特定IP(192.168.1.200 或192.168.1.201)通信包
3、抓取主机与特定IP(192.168.1.200 )之外的通信包
4、抓取特定端口数据包
5、抓取特定网段数据包
6、抓取特定协议数据包
7、条件组合过滤抓包
8、常用逻辑表达式
非 : ! or "not"
且 : && or "and"
或 : || or "or"
1、不解析域名以IP地址显示第三列的内容,sort -u去重
2、筛选源IP为192.168.1.100的包
3、筛选目的IP为192.168.1.100的包
4、筛选端口为50的包
5、以16进制显示端口80的包信息
Ⅲ 如何读懂tcpmp的输出
tcpmp 是 Linux 下的抓包工具,使用参数比较多,输出条目比较细。
tcpmp的命令行格式
tcpmp [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 类型 ] [ -w 文件名 ] [表达式 ]
tcpmp的参数选项
-A:以ASCII编码打印每个报文(不包括链路层的头),这对分析网页来说很方便;
-a:将网络地址和广播地址转变成名字;
-c<数据包数目>:在收到指定的包的数目后,tcpmp就会停止;
-C:用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,如果超过了就新建文件(文件名后缀是1、2、3依次增加);
-d:将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd:将匹配信息包的代码以c语言程序段的格式给出;
-ddd:将匹配信息包的代码以十进制的形式给出;
-D:列出当前主机的所有网卡编号和名称,可以用于选项 -i;
-e:在输出行打印出数据链路层的头部信息;
-f:将外部的Internet地址以数字的形式打印出来;
-F<表达文件>:从指定的文件中读取表达式,忽略其它的表达式;
-i<网络界面>:监听主机的该网卡上的数据流,如果没有指定,就会使用最小网卡编号的网卡(在选项-D可知道,但是不包括环路接口),linux 2.2 内核及之后的版本支持 any 网卡,用于指代任意网卡;
-l:如果没有使用 -w 选项,就可以将报文打印到 标准输出终端(此时这是默认);
-n:显示ip,而不是主机名;
-N:不列出域名;
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q:快速输出,仅列出少数的传输协议信息;
-r<数据包文件>:从指定的文件中读取包(这些包一般通过-w选项产生);
-s<数据包大小>:指定抓包显示一行的宽度,-s0表示可按包长显示完整的包,经常和-A一起用,默认截取长度为60个字节,但一般ethernetMTU都是1500字节。所以,要抓取大于60字节的包时,使用默认参数就会导致包数据丢失;
-S:用绝对而非相对数值列出TCP关联数;
-t:在输出的每一行不打印时间戳;
-tt:在输出的每一行显示未经格式化的时间戳记;
-T<数据包类型>:将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议);
-v:输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv:输出详细的报文信息;
-x/-xx/-X/-XX:以十六进制显示包内容,几个选项只有细微的差别,详见man手册;
-w<数据包文件>:直接将包写入文件中,并不分析和打印出来;
expression:用于筛选的逻辑表达式;
tcpmp的表达式
表达式是一个逻辑表达式,tcpmp利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。
在表达式中一般如下几种类型的关键字:
关于类型的关键字,主要包括host,net,port
例如,
host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明202.0.0.0是一个网络地址,port 23 指明端口号是23。
如果没有指定类型,缺省的类型是host.
关于传输方向的关键字:src,dst,dst or src,dst and src
例如,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。
关于协议的关键字:fddi,ip,arp,rarp,tcp,udp
Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和e ther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。
其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpmp将会监听所有协议的信息包。
逻辑运算符关键字
非运算 'not ' '! '
与运算 'and','&&'
或运算 'or' ,'||'
这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。
其他重要关键字
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater。
案例
想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
tcpmp host 210.27.48.1
想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
tcpmp host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3\)
如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
tcpmp ip host 210.27.48.1 and ! 210.27.48.2
如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
tcpmp tcp port 23 host 210.27.48.1
输出结果介绍
下面我们介绍几种典型的tcpmp命令的输出信息
数据链路层头信息
使用命令tcpmp --e host ice
ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:af:1a
H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5b:46
命令的输出结果如下所示:
21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.telnet 0:0(0) ack 22535 win 8760 (DF)
分析:
21:50:12 是显示的时间
847509 是ID号
eth0 < 表示从网络接口eth0 接受该数据包
eth0 > 表示从网络接口设备发送数据包
8:0:20:79:5b:46 是主机H219的MAC地址,它表明是从源地址H219发来的数据包
0:90:27:58:af:1a 是主机ICE的MAC地址,表示该数据包的目的地址是ICE
ip 是表明该数据包是IP数据包,
60 是数据包的长度,
h219.33357 > ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口
ack 22535 表明对序列号是222535的包进行响应
win 8760 表明发送窗口的大小是8760
ARP包的TCPDUMP输出信息
使用命令#tcpmp arp
得到的输出结果是:
22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
分析:
22:32:42 时间戳
802509 ID号
eth0 > 表明从主机发出该数据包
arp 表明是ARP请求包
who-has route tell ice 表明是主机ICE请求主机ROUTE的MAC地址
0:90:27:58:af:1a 是主机ICE的MAC地址。
TCP包的输出信息
用TCPDUMP捕获的TCP包的一般输出信息是:
src > dst: flagsdata-seqnoackwindowurgentoptions
src > dst 表明从源地址到目的地址
flags 是TCP包中的标志信息,S 是SYN标志, F(FIN), P(PUSH) , R(RST) "."(没有标记)
data-seqno 是数据包中的数据的顺序号
ack 是下次期望的顺序号
window 是接收缓存的窗口大小
urgent 表明数据包中是否有紧急指针
options 是选项
用TCPDUMP捕获的UDP包的一般输出信息是:
route.port1 > ice.port2: udplenth
UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的port2端口,类型是UDP, 包的长度是lenth
wireshark查看
要让wireshark能分析tcpmp的包,关键的地方是 -s 参数, 还有要保存为-w文件,例如下面的例子:
./tcpmp -i eth0 -s 0 -w SuccessC2Server.pcaphost 192.168.1.20 # 抓该主机的所有包,在wireshark中过滤
./tcpmp -i eth0 'dst host 239.33.24.212' -w raw.pcap # 抓包的时候就进行过滤
wireshark的过滤,很简单的,比如:
tcp.port eq 5541
ip.addr eq 192.168.2.1
过滤出来后, 用fllow tcp 查看包的内容。
其他
device eth0/eth1 entered promiscuous mode
message日志中提示:
kernel: device eth0 entered promiscuous mode
kernel: device eth0 left promiscuous mode
网卡进入了混杂模式。一般对通信进行抓包分析时进入混杂模式(tcpmp)。(默认网卡启用了混杂模式的)
关闭混杂模式:ifconfig eth0 -promisc
启用混杂模式:ifconfig eth0 promisc
TCP协议的KeepAlive机制与HeartBeat心跳包:http://www.nowamagic.net/academy/detail/23350382
TCP Keepalive HOWTO:http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/
Ⅳ 用tcpmp抓包,过滤规则有些看不懂,求高手解答
tcp头开始偏移20个字节后的两个字节为0x4745或0x4854的包。如果没有可选项的TCP包,应该是指版TCP发送的数据权数据开头两个字节为0x4745或0x4854的包
抓ARP响应包:arp && arp[6:2]==0002
Ⅳ tcpmp 命令的常用选项:二
code>tcpmp用于捕获和分析网络流量。系统管理员可以使用它来查看实时流量或将输出保存到文件中并在以后进行分析。下面列出5个常用选项
-r选项
如果你导出了一个 .pcap 文件,你就会知道不能使用文本编辑器来读取文件内容。因此,你应该使用-r file.pcap选项。它读取现有捕获的文件并将它们显示出来。
# 导出.pcap文件[root@localhost ~]# tcpmp -c 4 -i any port 53 -nn -w dns.pcap -vdropped privs to tcpmptcpmp: listening on any, link-type LINUX _SLL (Linux cooked), capture size 262144 bytes4 packets captured8 packets received by filter0 packets dropped by kernel# 使用-r选项读取.pcap文件[root@localhost ~]# tcpmp -r dns.pcap reading from file dns.pcap, link-type LINUX_SLL (Linux cooked)dropped privs to tcpmp19:33:54.533792 IP localhost.localdomain.48048 > _gateway.domain: 30912+ A? www.. (25)19:33:54.533835 IP localhost.localdomain.48048 > _gateway.domain: 51681+ AAAA? www.. (25)19:33:54.537733 IP _gateway.domain > localhost.localdomain.48048: 51681 NXDomain 0/1/0 (100)19:33:54.539312 IP _gateway.domain > localhost.localdomain.48048: 30912 NXDomain 0/1/0 (100)
host 选项
如果要过滤特定主机的流量,可以使用host选项后面添加ip 或者主机名来捕获特定主机的数据包。
[root@localhost ~]# tcpmp host redhat.com -i any -c5
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
20:27:19.762717 IP localhost.localdomain.59096 > redirect.redhat.com.https: Flags [S], seq 2565597156, win 29200, options [mss 1460,sackOK,TS val 178658343 ecr 0,nop,wscale 7], length 0
20:27:19.977742 IP redirect.redhat.com.https > localhost.localdomain.59096: Flags [S.], seq 1933719472, ack 2565597157, win 64240, options [mss 1460], length 0
20:27:19.977773 IP localhost.localdomain.59096 > redirect.redhat.com.https: Flags [.], ack 1, win 29200, length 0
20:27:19.983584 IP localhost.localdomain.59096 > redirect.redhat.com.https: Flags [P.], seq 1:518, ack 1, win 29200, length 517
20:27:19.983781 IP redirect.redhat.com.https > localhost.localdomain.59096: Flags [.], ack 518, win 64240, length 0
5 packets captured
9 packets received by filter
0 packets dropped by kernel
可以使用 src 或 dst 关键字告诉 tcpmp 捕获的数据包是否应包含源地址或目标地址中的主机。列入下面获取源主机地址为redhat.com的数据包,和获取目的主机地址为redhat.com的数据包:
[root@localhost ~]# tcpmp src host redhat.com -i any -c5
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
20:29:23.090360 IP redirect.redhat.com.https > localhost.localdomain.59098: Flags [S.], seq 1420240111, ack 1139421965, win 64240, options [mss 1460], length 0
20:29:23.096748 IP redirect.redhat.com.https > localhost.localdomain.59098: Flags [.], ack 518, win 64240, length 0
20:29:23.353159 IP redirect.redhat.com.https > localhost.localdomain.59098: Flags [P.], seq 1:1381, ack 518, win 64240, length 1380
20:29:23.353434 IP redirect.redhat.com.https > localhost.localdomain.59098: Flags [.], seq 1381:2841, ack 518, win 64240, length 1460
20:29:23.353461 IP redirect.redhat.com.https > localhost.localdomain.59098: Flags [P.], seq 2841:3407, ack 518, win 64240, length 566
5 packets captured
9 packets received by filter
0 packets dropped by kernel
[root@localhost ~]# tcpmp dst host redhat.com -i any -c5
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
20:29:35.661917 IP localhost.localdomain.59100 > redirect.redhat.com.https: Flags [S], seq 4207740141, win 29200, options [mss 1460,sackOK,TS val 178783790 ecr 0,nop,wscale 7], length 0
20:29:35.886845 IP localhost.localdomain.59100 > redirect.redhat.com.https: Flags [.], ack 1287594187, win 29200, length 0
20:29:35.892463 IP localhost.localdomain.59100 > redirect.redhat.com.https: Flags [P.], seq 0:517, ack 1, win 29200, length 517
20:29:36.121990 IP localhost.localdomain.59100 > redirect.redhat.com.https: Flags [.], ack 1461, win 32120, length 0
20:29:36.122028 IP localhost.localdomain.59100 > redirect.redhat.com.https: Flags [.], ack 2921, win 35040, length 0
5 packets captured
10 packets received by filter
0 packets dropped by kernel
逻辑运算符
tcpmp 支持and/or/not运算符作为关键字,例如,tcpmp -i ens33 “host www.linuxprobe.com and (port 80 or port 443)”。在复合表达式周围使用引号是很有必要的,这样 bash shell 就不会试图解释括号。
[root@localhost ~]# tcpmp -i any "host www.linuxprobe.com and (port 80 or port 443)" -s64 -c5
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 64 bytes
20:37:12.398299 IP localhost.localdomain.52754 > 140.249.61.18.https: Flags [S], seq 3304304157, win 29200, options [mss 1460,sackOK,TS[|tcp]>
20:37:12.408805 IP 140.249.61.18.https > localhost.localdomain.52754: Flags [S.], seq 2112965730, ack 3304304158, win 64240, options [mss 1460], length 0
20:37:12.408842 IP localhost.localdomain.52754 > 140.249.61.18.https: Flags [.], ack 1, win 29200, length 0
20:37:12.414672 IP localhost.localdomain.52754 > 140.249.61.18.https: Flags [P.], seq 1:518, ack 1, win 29200, length 517
20:37:12.414948 IP 140.249.61.18.https > localhost.localdomain.52754: Flags [.], ack 518, win 64240, length 0
5 packets captured
9 packets received by filter
0 packets dropped by kernel
site.qudong.com/2017/0220/394075.shtml
www.techweb.com.cn/prnews/qiyenews/archives/26181.html
www.zjqiye.net/2016/0226/177817.shtml
net 关键字
net 关键字可用于捕获一个网段的数据包。net关键字还可以将 src 和 ds与逻辑运算符一起使用,并更精确地过滤包。下面实例是获取源net为192.168.0.0/16网段,并且目标net不包含192.168.0.0/16网段的数据包。
[root@localhost ~]# tcpmp -i any -n "src net 192.168.0.0/16 and not dst net 192.168.0.0/16" -c4
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
20:43:25.558537 IP 192.168.43.131.34562 > 140.249.61.18.http: Flags [S], seq 3720011773, win 29200, options [mss 1460,sackOK,TS val 4199917698 ecr 0,nop,wscale 7], length 0
20:43:25.571477 IP 192.168.43.131.34562 > 140.249.61.18.http: Flags [.], ack 1199844, win 29200, length 0
20:43:25.571693 IP 192.168.43.131.34562 > 140.249.61.18.http: Flags [P.], seq 0:82, ack 1, win 29200, length 82: HTTP: GET / HTTP/1.1
20:43:25.587514 IP 192.168.43.131.34562 > 140.249.61.18.http: Flags [.], ack 546, win 29975, length 0
4 packets captured
4 packets received by filter
0 packets dropped by kernel
ip6 关键字
可以使用 ip6 关键字捕获 IPv6 流量。下面是一个例子:
[root@localhost ~]# tcpmp -i any ip6 host fe80::9520:7b41:7099:c6f7 -c4
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
22:17:08.182720 IP6 localhost.localdomain > fe80::9520:7b41:7099:c6f7: ICMP6, echo request, seq 12, length 64
22:17:08.183329 IP6 fe80::9520:7b41:7099:c6f7 > localhost.localdomain: ICMP6, echo reply, seq 12, length 64
22:17:09.207102 IP6 localhost.localdomain > fe80::9520:7b41:7099:c6f7: ICMP6, echo request, seq 13, length 64
22:17:09.207555 IP6 fe80::9520:7b41:7099:c6f7 > localhost.localdomain: ICMP6, echo reply, seq 13, length 64
4 packets captured
4 packets received by filter
0 packets dropped by kernel
总结
tcpmp 用于收集有关网络流量数据的出色工具。数据包捕获为故障排除和安全分析提供了有用的信息。
Ⅵ tcpmp 高级过滤方式
首先了解如何从包头过滤信息
操作符 : >, <, >=, <=, =, !=
长度4比特。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(8 4),因此,一个IP包头的长度最长为“1111”,即15 4=60个字节。IP包头最小长度为20字节。
16比特,以字节为单位描述IP包的总长度(包括头部和数据两部分),最大值为65535。第二行中标识符、标志和段偏移量通常联合使用,用于数据拆分时的分组和重组。
对于上层发来的较大的数据包,往往需要拆分。路由器将一个大包进行拆分后,拆出来的所有部分被标上相同的值,该值即为标识符,用于告诉目的端哪些包属于同一个大包。
长度3比特。该字段第一位不使用。第二位是DF(Don't Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。
长度13比特,表示一个数据包在原先被拆分前的大包中的位置。接收端据此来还原和组装IP包。
表示IP包的生存时间,长度8比特。长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。
长度8比特,标识上一层即传输层在本次数据传输中所使用的协议。比如6代表TCP,17代表UDP等
长度16位。用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。
长度32比特,标识IP包的起源地址。
长度32比特,表示IP包的目的地址。
可变长字段,主要用于测试,由起源设备跟据需要改写。
因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍
一般 的IP头是20字节,但IP头有选项设置,不能直接从偏移21字节处读取数据。IP头有个长度字段可以知道头长度是否大于20字节。
通常第一个字节的二进制值是:01000101,
分成两个部分:
如果第一字节第二部分的值大于5,那么表示头有IP选项。
下面介绍有过滤方法
**0100 0101 **: 第一字节的二进制
0000 1111 : 与操作
<=========
0000 0101 : 结果
正确的过滤方法:
或者
当发送端的MTU大于到目的路径链路上的MTU时就会被分片,分片信息在IP头的第七和第八字节:
Bit 0 : 保留,必须是0
Bit 1 : (DF) 0 = 可能分片, 1 = 不分片
Bit 2 : (MF) 0 = 最后的分片, 1 = 还有分片
Fragment Offset 字段只有在分片的时候才使用。
要抓带DF位标记的不分片的包,第七字节的值应该是:
01000000 = 64
最后分片包的开始3位是0,但是有Fragment Offset字段。
测试分片可以用下面的命令:
TTL字段在第九字节,并且正好是完整的一个字节,TTL最大值是255,二进制为11111111。
可以用下面的命令验证一下:
首先还是需要知道TCP基本结构
16位源端口号和16位目的端口号。
32位序号 :
一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号,通过这个来确认发送的数据有序,比如现在序列号为1000,发送了1000,下一个序列号就是2000。
32位确认号 :
用来响应TCP报文段,给收到的TCP报文段的序号加1,三握时还要携带自己的序号。
4位头部长度 :
标识该TCP头部有多少个4字节,共表示最长15*4=60字节。同IP头部。
6位保留 :
6位标志。URG(紧急指针是否有效)ACK(表示确认号是否有效)PSH(提示接收端应用程序应该立即从TCP接收缓冲区读走数据)RST(表示要求对方重新建立连接)SYN(表示请求建立一个连接)FIN(表示通知对方本端要关闭连接)
16位窗口大小 :
TCP流量控制的一个手段,用来告诉对端TCP缓冲区还能容纳多少字节。
16位校验和 :
由发送端填充,接收端对报文段执行CRC算法以检验TCP报文段在传输中是否损坏。
16位紧急指针 :
一个正的偏移量,它和序号段的值相加表示最后一个紧急数据的下一字节的序号。
标志位字段(U、A、P、R、S、F) :
占6比特。各比特的含义如下:
TCP标记定义在TCP头的第十四个字节
tcpmp考虑了一些数字恐惧症者的需求,提供了部分常用的字段偏移名字:
ICMP类型值有 :
icmp-echoreply , icmp-unreach , icmp-sourcequench , icmp-redirect , icmp-echo , icmp-routeradvert , icmp-routersolicit , icmp-timxceed , icmp-paramprob , icmp-tstamp , icmp-tstampreply , icmp-ireq , icmp-ireqreply , icmp-maskreq , icmp-maskreply
TCP标记值 :
tcp-fin , tcp-syn , tcp-rst , tcp-push , tcp-push , tcp-ack , tcp-urg
这样上面按照TCP标记位抓包的就可以写直观的表达式了:
抓取数据区开始为"MAIL"的包,"MAIL"的十六进制为0x4d41494c。
"GET "的十六进制是47455420
"SSH-"的十六进制是0x5353482D
Ⅶ Tcpmp 看这一篇就够了
tcpmp 是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有。熟悉 tcpmp 的使用能够帮助你分析调试网络数据,本文将通过一个个具体的示例来介绍它在不同场景下的使用方法。不管你是系统管理员,程序员,云原生工程师还是 yaml 工程师,掌握 tcpmp 的使用都能让你如虎添翼,升职加薪。
tcpmp 的常用参数如下:
额外再介绍几个常用参数:
-A 表示使用 ASCII 字符串打印报文的全部数据,这样可以使读取更加简单,方便使用 grep 等工具解析输出内容。 -X 表示同时使用十六进制和 ASCII 字符串打印报文的全部数据。这两个参数不能一起使用。例如:
后面可以跟上协议名称来过滤特定协议的流量,以 UDP 为例,可以加上参数 udp 或 protocol 17 ,这两个命令意思相同。
同理, tcp 与 protocol 6 意思相同。
使用过滤器 host 可以抓取特定目的地和源 IP 地址的流量。
也可以使用 src 或 dst 只抓取源或目的地:
使用 tcpmp 截取数据报文的时候,默认会打印到屏幕的默认输出,你会看到按照顺序和格式,很多的数据一行行快速闪过,根本来不及看清楚所有的内容。不过,tcpmp 提供了把截取的数据保存到文件的功能,以便后面使用其他图形工具(比如 wireshark,Snort)来分析。
-w 选项用来把数据报文输出到文件:
如果想实时将抓取到的数据通过管道传递给其他工具来处理,需要使用 -l 选项来开启行缓冲模式(或使用 -c 选项来开启数据包缓冲模式)。使用 -l 选项可以将输出通过立即发送给其他命令,其他命令会立即响应。
过滤的真正强大之处在于你可以随意组合它们,而连接它们的逻辑就是常用的 与/AND/&& 、 或/OR/|| 和 非/not/!。
关于 tcpmp 的过滤器,这里有必要单独介绍一下。
机器上的网络报文数量异常的多,很多时候我们只关系和具体问题有关的数据报(比如访问某个网站的数据,或者 icmp 超时的报文等等),而这些数据只占到很小的一部分。把所有的数据截取下来,从里面找到想要的信息无疑是一件很费时费力的工作。而 tcpmp 提供了灵活的语法可以精确地截取关心的数据报,简化分析的工作量。这些选择数据包的语句就是过滤器(filter)!
Host 过滤器用来过滤某个主机的数据报文。例如:
该命令会抓取所有发往主机 1.2.3.4 或者从主机 1.2.3.4 发出的流量。如果想只抓取从该主机发出的流量,可以使用下面的命令:
Network 过滤器用来过滤某个网段的数据,使用的是 CIDR[2] 模式。可以使用四元组(x.x.x.x)、三元组(x.x.x)、二元组(x.x)和一元组(x)。四元组就是指定某个主机,三元组表示子网掩码为 255.255.255.0,二元组表示子网掩码为 255.255.0.0,一元组表示子网掩码为 255.0.0.0。例如,
抓取所有发往网段 192.168.1.x 或从网段 192.168.1.x 发出的流量:
抓取所有发往网段 10.x.x.x 或从网段 10.x.x.x 发出的流量:
和 Host 过滤器一样,这里也可以指定源和目的:
也可以使用 CIDR 格式:
Proto 过滤器用来过滤某个协议的数据,关键字为 proto,可省略。proto 后面可以跟上协议号或协议名称,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp和 tcp。因为通常的协议名称是保留字段,所以在与 proto 指令一起使用时,必须根据 shell 类型使用一个或两个反斜杠(/)来转义。Linux 中的 shell 需要使用两个反斜杠来转义,MacOS 只需要一个。
例如,抓取 icmp 协议的报文:
Port 过滤器用来过滤通过某个端口的数据报文,关键字为 port。例如:
截取数据只是第一步,第二步就是理解这些数据,下面就解释一下 tcpmp 命令输出各部分的意义。
最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是 192.168.1.106,源端口是 56166,目的地址是 124.192.132.54,目的端口是 80。> 符号代表数据的方向。
此外,上面的三条数据还是 tcp 协议的三次握手过程,第一条就是 SYN 报文,这个可以通过 Flags [S] 看出。下面是常见的 TCP 报文的 Flags:
下面给出一些具体的例子,每个例子都可以使用多种方法来获得相同的输出,你使用的方法取决于所需的输出和网络上的流量。我们在排障时,通常只想获取自己想要的内容,可以通过过滤器和 ASCII 输出并结合管道与 grep、cut、awk 等工具来实现此目的。
例如,在抓取 HTTP 请求和响应数据包时,可以通过删除标志 SYN/ACK/FIN 来过滤噪声,但还有更简单的方法,那就是通过管道传递给 grep。在达到目的的同时,我们要选择最简单最高效的方法。下面来看例子。
从 HTTP 请求头中提取 HTTP 用户代理:
通过 egrep 可以同时提取用户代理和主机名(或其他头文件):
抓取 HTTP GET 流量:
也可以抓取 HTTP POST 请求流量:
注意:该方法不能保证抓取到 HTTP POST 有效数据流量,因为一个 POST 请求会被分割为多个 TCP 数据包。
上述两个表达式中的十六进制将会与 GET 和 POST 请求的 ASCII 字符串匹配。例如,tcp[((tcp[12:1] & 0xf0) >> 2):4] 首先会确定我们感兴趣的字节的位置[3](在 TCP header 之后),然后选择我们希望匹配的 4 个字节。
提取 HTTP 请求的主机名和路径:
从 HTTP POST 请求中提取密码和主机名:
提取 Set-Cookie(服务端的 Cookie)和 Cookie(客户端的 Cookie):
查看网络上的所有 ICMP 数据包:
通过排除 echo 和 reply 类型的数据包使抓取到的数据包不包括标准的 ping 包:
可以提取电子邮件的正文和其他数据。例如,只提取电子邮件的收件人:
抓取 NTP 服务的查询和响应
通过 SNMP 服务,渗透测试人员可以获取大量的设备和系统信息。在这些信息中,系统信息最为关键,如操作系统版本、内核版本等。使用 SNMP 协议快速扫描程序 onesixtyone,可以看到目标系统的信息:
当抓取大量数据并写入文件时,可以自动切割为多个大小相同的文件。例如,下面的命令表示每 3600 秒创建一个新文件 capture-(hour).pcap,每个文件大小不超过 200*1000000 字节:
这些文件的命名为 capture-{1-24}.pcap,24 小时之后,之前的文件就会被覆盖。
可以通过过滤器 ip6 来抓取 IPv6 流量,同时可以指定协议如 TCP:
从之前保存的文件中读取 IPv6 UDP 数据报文:
在下面的例子中,你会发现抓取到的报文的源和目的一直不变,且带有标志位 [S] 和 [R],它们与一系列看似随机的目标端口进行匹配。当发送 SYN 之后,如果目标主机的端口没有打开,就会返回一个 RESET。这是 Nmap 等端口扫描工具的标准做法。
本例中 Nmap NSE 测试脚本 http-enum.nse 用来检测 HTTP 服务的合法 URL。
在执行脚本测试的主机上:
在目标主机上:
向 Google 公共 DNS 发起的出站 DNS 请求和 A 记录响应可以通过 tcpmp 抓取到:
抓取 80 端口的 HTTP 有效数据包,排除 TCP 连接建立过程的数据包(SYN / FIN / ACK):
通常 Wireshark(或 tshark)比 tcpmp 更容易分析应用层协议。一般的做法是在远程服务器上先使用 tcpmp 抓取数据并写入文件,然后再将文件拷贝到本地工作站上用 Wireshark 分析。
还有一种更高效的方法,可以通过 ssh 连接将抓取到的数据实时发送给 Wireshark 进行分析。以 MacOS 系统为例,可以通过 brew cask install wireshark 来安装,然后通过下面的命令来分析:
例如,如果想分析 DNS 协议,可以使用下面的命令:
抓取到的数据:
找出一段时间内发包最多的 IP,或者从一堆报文中找出发包最多的 IP,可以使用下面的命令:
cut -f 1,2,3,4 -d '.' : 以 . 为分隔符,打印出每行的前四列。即 IP 地址。
sort | uniq -c : 排序并计数
sort -nr : 按照数值大小逆向排序
本例将重点放在标准纯文本协议上,过滤出于用户名和密码相关的报文:
最后一个例子,抓取 DHCP 服务的请求和响应报文,67 为 DHCP 端口,68 为客户机端口。
本文主要介绍了 tcpmp 的基本语法和使用方法,并通过一些示例来展示它强大的过滤功能。将 tcpmp 与 wireshark 进行组合可以发挥更强大的功效,本文也展示了如何优雅顺滑地结合 tcpmp 和 wireshark。如果你想了解更多的细节,可以查看 tcpmp 的 man 手册。
Ⅷ Tcpmp 用法详解
大部分 Linux 发行版都内置了 Tcpmp 工具。如果没有,也可以直接使用对应的包管理器进行安装(如: $ sudo apt-get install tcpmp 和 $ sudo yum install tcpmp )
通过表达式可以对各种不同类型的网络流量进行过滤,以获取到需要的信息。这也是 tcpmp 强大功能的一个体现。
主要有 3 种类型的表达式:
指定网络接口 :
# tcpmp -i <dev>
原始信息输出模式 :
# tcpmp -ttttnnvvS
更详细的输出,不解析主机名和端口名,使用绝对序列号,方便阅读的时间戳
通过IP地址过滤 :
# tcpmp host 10.2.64.1
HEX 输出
# tcpmp -nnvXSs 0 -c1 icmp
通过源地址和目标地址进行过滤
# tcpmp src 10.2.67.203
# tcpmp dst 10.2.67.203
通过子网进行过滤
# tcpmp net 10.2.64.0/24
监听指定端口号
# tcpmp port 515
指定协议
# tcpdmp icmp
端口范围
# tcpmp portrange 21-23
通过包大小过滤
# tcpmp less 32
# tcpmp greater 64
# tcpmp <= 128
写入 PCAP 文件
# tcpmp port 80 -w capture_file
读取 PCAP 文件
# tcpmp -r capture_file
可以通过命令选项的不同组合(使用 逻辑运算符 )完成更复杂的任务。运算符包括以下3种:
# tcpmp src 10.2.64.29 and dst port 80
即捕捉从指定主机(10.2.64.92)发出,且目标端口为 80 的所有网络数据
# tcpmp src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16
即捕捉从指定子网(192.168.0.0/16)发送到目标子网(10.0.0.0/8 和 172.16.0.0/16)的所有网络数据
# tcpmp src 192.168.56.1 and not dst port 22
即捕捉从指定主机(192.168.56.1)发出,且目标端口不为 22 的所有网络数据
# tcpmp 'tcp[13] & 32!=0' 所有 URGENT ( URG ) 包
# tcpmp 'tcp[13] & 16!=0' 所有 ACKNOWLEDGE ( ACK ) 包
# tcpmp 'tcp[13] & 8!=0' 所有 PUSH ( PSH ) 包
# tcpmp 'tcp[13] & 4!=0' 所有 RESET ( RST ) 包
# tcpmp 'tcp[13] & 2!=0' 所有 SYNCHRONIZE ( SYN ) 包
# tcpmp 'tcp[13] & 1!=0' 所有 FINISH ( FIN ) 包
# tcpmp 'tcp[13]=18' 所有 SYNCHRONIZE/ACKNOWLEDGE ( SYNACK ) 包
其他指定标志位的方式如:
# tcpmp 'tcp[tcpflags] == tcp-syn'
# tcpmp 'tcp[tcpflags] == tcp-fin'
一些特殊的用法
# tcpmp 'tcp[13] = 6' RST 和 SYN 同时启用的数据包(不正常)
# tcpmp 'tcp[32:4] = 0x47455420' 获取 http GET 请求的文本
# tcpmp 'tcp[(tcp[12]>>2):4] = 0x5353482D' 获取任何端口的 ssh 连接(通过 banner 信息)
# tcpmp 'ip[8] < 10' ttl 小于 10 的数据包(出现问题或 traceroute 命令)
# tcpmp 'ip[6] & 128 != 0' 非常有可能是黑客入侵的情况
A tcpmp Tutorial and Primer with Examples
Ⅸ tcpmp 命令的常用选项:一
tcpmp用于捕获和分析网络流量。系统管理员可以使用它来查看实时流量或将输出保存到文件中并在以后进行分析。下面列出6个常用选项
-D 选项
tcpmp的-D获取接口设备列表。看到此列表后,可以决定要在哪个接口上捕获流量。它还告诉你接口是否已启动、正在运行,以及它是否是环回接口,如下所示:
[root@localhost ~]# tcpmp -D1.ens160 [Up, Running]2.lo [Up, Running, Loopback]3.any (Pseudo-device that captures on all interfaces) [Up, Running]4.bluetooth-monitor (Bluetooth Linux Monitor) [none]5.nflog (Linux netfilter log (NFLOG) interface) [none]6.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]7.usbmon0 (All USB buses) [none]8.usbmon1 (USB bus number 1)9.usbmon2 (USB bus number 2)
-c [数字]选项
-c 选项捕获 X 个数据包,然后停止。否则,tcpmp 将无限地继续运行。因此,当只想捕获一小部分数据包样本时,可以使用此选项。但是如果接口上没有数据流量,tcpmp 会一直等待。
[root@localhost ~]# tcpmp -c 5 -i any
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
17:33:47.713379 IP localhost.localdomain.ssh > 192.168.43.1.39970: Flags [P.], seq 714380127:714380371, ack 1854022435, win 388, length 244
17:33:47.713785 IP localhost.localdomain.36821 > _gateway.domain: 36365+ PTR? 1.43.168.192.in-addr.arpa. (43)
17:33:47.713939 IP 192.168.43.1.39970 > localhost.localdomain.ssh: Flags [.], ack 244, win 4104, length 0
17:33:47.716053 IP _gateway.domain > localhost.localdomain.36821: 36365 NXDomain 0/1/0 (78)
17:33:47.716543 IP localhost.localdomain.57441 > _gateway.domain: 61445+ PTR? 131.43.168.192.in-addr.arpa. (45)
5 packets captured
9 packets received by filter
0 packets dropped by kernel
-n 选项
-n选项不将IP地址解析为域名,直接以IP地址显示:
[root@localhost ~]# tcpmp -c 5 -i any -n
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
17:36:38.980756 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 714383039:714383283, ack 1854024303, win 388, length 244
17:36:38.981032 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 244:440, ack 1, win 388, length 196
17:36:38.981096 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 440:604, ack 1, win 388, length 164
17:36:38.981153 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 604:768, ack 1, win 388, length 164
17:36:38.981208 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 768:932, ack 1, win 388, length 164
5 packets captured
5 packets received by filter
0 packets dropped by kernel
www.51cto.com/it/news/2020/0113/18299.html
www.donews.com/news/detail/4/2971720.html
news.yesky.com/hotnews/311/109240311.shtml
-s 选项
带有-sXXX 的 tcpmp 可帮助你控制捕获数据包的大小。在上一个输出的第三行中,可以看到它表示捕获大小 262144 字节。可以使用-s选项更改捕获数据大小。如果你只想检查数据包标头,则可以使用较小的大小进行捕获:
[root@localhost ~]# tcpmp -c 5 -i any -n -s64
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 64 bytes
17:47:44.437891 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 714405271:714405515, ack 1854033767, win 388, length 244
17:47:44.438153 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 244:440, ack 1, win 388, length 196
17:47:44.438220 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 440:604, ack 1, win 388, length 164
17:47:44.438301 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 604:768, ack 1, win 388, length 164
17:47:44.438361 IP 192.168.43.131.ssh > 192.168.43.1.39970: Flags [P.], seq 768:932, ack 1, win 388, length 164
5 packets captured
5 packets received by filter
0 packets dropped by kernel
端口捕获
tcpmp 允许你指定使用某个端口作为源或目标的网络数据包。例如,要捕获 DNS 流量,你可以使用端口 53。可以在 port选项前加上 src/dst。如 src port 53 或 dst port 53 并进一步过滤它。
[root@localhost ~]# tcpmp -i any port 53 -n
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
17:50:48.158109 IP 192.168.43.131.47054 > 192.168.43.2.domain: 58704+ A? www..com. (31)
17:50:48.158152 IP 192.168.43.131.47054 > 192.168.43.2.domain: 60504+ AAAA? www..com. (31)
17:50:48.159180 IP 192.168.43.2.domain > 192.168.43.131.47054: 60504 1/1/0 CNAME www.a.shifen.com. (115)
17:50:48.162018 IP 192.168.43.2.domain > 192.168.43.131.47054: 58704 3/0/0 CNAME www.a.shifen.com., A 180.101.49.11, A 180.101.49.12 (90)
下面只获取源端口为53的数据包,其中-nn选项表示不解析IP地址和端口:
[root@localhost ~]# tcpmp -c 5 -i any src port 53 -nn -s64
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 64 bytes
18:00:41.604216 IP 192.168.43.2.53 > 192.168.43.131.48245: 50676[|domain]
18:00:41.606390 IP 192.168.43.2.53 > 192.168.43.131.48245: 19947[|domain]
18:00:41.631001 IP 192.168.43.2.53 > 192.168.43.131.54536: 31350 NXDomain[|domain]
18:00:46.110591 IP 192.168.43.2.53 > 192.168.43.131.42379: 17512[|domain]
18:00:46.110603 IP 192.168.43.2.53 > 192.168.43.131.42379: 40562[|domain]
5 packets captured
5 packets received by filter
0 packets dropped by kernel
下面只获取目的端口为53的数据包:
[root@localhost ~]# tcpmp -c 5 -i any dst port 53 -nn -s64
dropped privs to tcpmp
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 64 bytes
18:01:22.568585 IP 192.168.43.131.49444 > 192.168.43.2.53: 27625+[|domain]
18:01:22.568623 IP 192.168.43.131.49444 > 192.168.43.2.53: 42481+[|domain]
18:01:22.595257 IP 192.168.43.131.45790 > 192.168.43.2.53: 28116+[|domain]
18:01:23.850730 IP 192.168.43.131.34861 > 192.168.43.2.53: 23444+[|domain]
18:01:23.850762 IP 192.168.43.131.34861 > 192.168.43.2.53: 23964+[|domain]
5 packets captured
5 packets received by filter
0 packets dropped by kernel
-w 选项
如果要将 tcpmp 的输出写入文件,请使用选项-w选项写入文件。如果想查看写了多少数据包,可以加-v选项。
[root@localhost ~]# tcpmp -c 4 -i any port 53 -nn -w dns.pcap -v
dropped privs to tcpmp
tcpmp: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
4 packets captured
6 packets received by filter
0 packets dropped by kernel
总结
tcpmp 用于收集有关网络流量数据的出色工具。数据包捕获为故障排除和安全分析提供了有用的信息。
Ⅹ tcpmp是什么意思.干什么用的.哪里有详细的资料,
TCPDUMP简介
在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的。对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过sniffer工具来分析原因,找出造成网络阻塞的来源。对于网络程序员来说,通过sniffer工具来调试程序。
用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共享式的局域网中,采用sniffer工具简直可以对网络中的所有流量一览无余!Sniffer工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。
Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。所以,今天我们就来看看Linux中强大的网络数据采集分析工具——TcpDump。
用简单的话来定义tcpmp,就是:mp the traffice on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。
作为互联网上经典的的系统管理员必备工具,tcpmp以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的东东之一。
顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
tcpmp提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpmp存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。
普通情况下,直接启动tcpmp将监视第一个网络界面上所有流过的数据包。
-----------------------
bash-2.02# tcpmp
tcpmp: listening on eth0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
^C
------------------------
首先我们注意一下,从上面的输出结果上可以看出来,基本上tcpmp总的的输出格式为:系统时间 来源主机.端口 > 目标主机.端口 数据包参数
TcpDump的参数化支持
tcpmp支持相当多的不同参数,如使用-i参数指定tcpmp监听的网络界面,这在计算机具有多个网络界面时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。
然而更复杂的tcpmp参数是用于过滤目的,这是因为网络中流量很大,如果不加分辨将所有的数据包都截留下来,数据量太大,反而不容易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpmp使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpmp查看这些过滤规则的具体用法。
显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpmp之类的网络分析工具。
并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。
May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled
虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的问题。网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。因此对捕获的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。
从上面tcpmp的输出可以看出,tcpmp对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpmp 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
TCP功能
数据过滤
不带任何参数的TcpDump将搜索系统中所有的网络接口,并显示它截获的所有数据,这些数据对我们不一定全都需要,而且数据太多不利于分析。所以,我们应当先想好需要哪些数据,TcpDump提供以下参数供我们选择数据:
-b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
例如:tcpmp -b arp 将只显示网络中的arp即地址转换协议信息。
-i 选择过滤的网络接口,如果是作为路由器至少有两个网络接口,通过这个选项,就可以只过滤指定的接口上通过的数据。例如:
tcpmp -i eth0 只显示通过eth0接口上的所有报头。
src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst 、port、host、net、ehost等附加选项。他们用来分辨数据包的来源和去向,src host 192.168.0.1指定源主机IP地址是192.168.0.1,dst net 192.168.0.0/24指定目标是网络192.168.0.0。以此类推,host是与其指定主机相关无论它是源还是目的,net是与其指定网络相关的,ether后面跟的不是IP地址而是物理地址,而gateway则用于网关主机。可能有点复杂,看下面例子就知道了:
tcpmp src host 192.168.0.1 and dst net 192.168.0.0/24
过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头。
tcpmp ether src 00:50:04:BA:9B and dst……
过滤源主机物理地址为XXX的报头(为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。
Tcpmp src host 192.168.0.1 and dst port not telnet
过滤源主机192.168.0.1和目的端口不是telnet的报头。
ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。
例如:
tcpmp ip src……
只过滤数据-链路层上的IP报头。
tcpmp udp and src host 192.168.0.1
只过滤源主机192.168.0.1的所有udp报头。
数据显示/输入输出
TcpDump提供了足够的参数来让我们选择如何处理得到的数据,如下所示:
-l 可以将数据重定向。
如tcpmp -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中。
-n 不进行IP地址到主机名的转换。
如果不使用这一项,当系统中存在某一主机的主机名时,TcpDump会把IP地址转换为主机名显示,就像这样:eth0 < ntc9.1165> router.domain.net.telnet,使用-n后变成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。
-nn 不进行端口名称的转换。
上面这条信息使用-nn后就变成了:eth0 < ntc9.1165 > router.domain.net.23。
-N 不打印出默认的域名。
还是这条信息-N 后就是:eth0 < ntc9.1165 > router.telnet。
-O 不进行匹配代码的优化。
-t 不打印UNIX时间戳,也就是不显示时间。
-tt 打印原始的、未格式化过的时间。
-v 详细的输出,也就比普通的多了个TTL和服务类型。
TCPDUMP的安装
在linux下tcpmp的安装十分简单,一般由两种安装方式。一种是以rpm包的形式来进行安装。另外一种是以源程序的形式安装。
1. rpm包的形式安装
#rpm -ivh tcpmp-3_4a5.rpm
这样tcpmp就顺利地安装到你的linux系统中。怎么样,很简单吧。
2. 源程序的安装
#tar xvfz tcpmp-3_4a5.tar.Z
rpm的包可以使用如下命令安装:
#rpm -ivh tcpmp-3_4a5.src.rpm
这样就把tcpmp的源代码解压到/usr/src/redhat/SOURCES目录下.
第二步 做好编译源程序前的准备活动
在编译源程序之前,最好已经确定库文件libpcap已经安装完毕,这个库文件是tcpmp软件所需的库文件 。同样,你同时还要有一个标准的c语言编译器。在linux下标准的c 语言编译器一般是gcc。 在tcpmp的源程序目录中。有一个文件是Makefile.in,configure命令就是从Makefile.in文件中自动产生Makefile文件。在Makefile.in文件中,可以根据系统的配置来修改BINDEST 和 MANDEST 这两个宏定义,缺省值是
BINDEST = @sbindir@
MANDEST = @mandir@
第一个宏值表明安装tcpmp的二进制文件的路径名,第二个表明tcpmp的man 帮助页的路径名,你可以修改它们来满足系统的需求。
第三步 编译源程序
使用源程序目录中的configure脚本,它从系统中读出各种所需的属性。并且根据Makefile.in文件自动生成Makefile文件,以便编译使用.make 命令则根据Makefile文件中的规则编译tcpmp的源程序。使用make install命令安装编译好的tcpmp的二进制文件。
总结一下就是:
# tar xvfz tcpmp-3_4a5.tar.Z
# vi Makefile.in
# . /configure
# make
# make install
关于tcpmp更详细的信息,请查看Man tcpmp。