1、概述
在处理IP网络的故障时,经常使用以太网抓包工具来查看和抓取IP网络上某些端口或某些网段的数据包,并对这些数据包进行分析,定位问题。
在 IMON项目里,使用抓包工具抓包进行分析的场景在EPG采集、引流模块和软终端监看模块,一般情况下EPG 采集和引流模块比较稳定,软终端监看还涉及SS5代理,这部分出问题的几率比较大,这是就有可能要现场维护人员抓包进行分析、排查、定位问题,确定是网络问题还是软件问题,如果是软件问题则要将抓回的包发给研发解决。
EPG 抓包可分为对鉴权过程、采集过程抓包验证,主要是通过通过抓包分析与IPTV 鉴 权服务器之间的TCP交互。
流媒体交互抓包可分为对组播、点播进行抓包,一般交互的协议分为IGMP、RTSP、RTMP等,组播一般是基于UDP的IGMP流,点播是基于RTP的RTSP流或基于TCP的RTMP流。
软终端抓包主要是抓取软终端与IPTV服务器交互、SS5与IPTV服务器交互的数据包,一般跟流媒体交互的报文协议差不多,也是分为组播IGMP 、点播 RTSP等协议,不过经过测试发现江苏的部分组播(可能是用户不同所致)发送的是RTSP的包。
2、常用抓包工具
、WireShark
Wireshark 是一个非常好用的抓包工具,当我们遇到一些和网络相关的问题时,可以通过这个工具进行分析,不过要说明的是,这只是一个工具,用法是非常灵活的。
过滤器的区别
捕捉过滤器(CaptureFilters ):用于决定将什么样的信息记录在捕捉结果中。需要在开始捕捉前设置。
显示过滤器(DisplayFilters ): 在捕捉结果中进行详细查找。他们可以在得到捕捉结果后随 意修改。
捕捉过滤器
Protocol(协议) :
可能的值 : ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
如果没有特别指明是什么协议,则默认使用所有支持的协议。
Direction (方向):
可能的值 : src, dst, src and dst, src or dst
如果没有特别指明来源或目的地,则默认使用“ src or dst”作为关键字。
例如,” host ″与” src or dst host ″是一样的。
Host(s):
可能的值:net, port, host, portrange.
如果没有指定此值,则默认使用”host”关键字。 例如,” src ″与” src host ″相同。
Logical Operations (逻辑运算):
可能的值: not, and, or.
否( “not” )具有最高的优先级。或(“ or” )和与 (“ and”) 具有相同的优先级,运算时从左至 右进行。
例如,
“not tcp port and tcp port ″与” (not tcp port ) and tcp port ″相同。 “not tcp port and tcp port ″与” not (tcp port and tcp port ) ”不同。
例子:
tcp dst port // 捕捉目的TCP 端口为 的封包。
ip src host // 捕捉来源IP 地址为 的封包。
host // 捕捉目的或来源IP 地址为 的封包。
ether host e0--c5--b1-3c // 捕捉目的或来源MAC 地址为e0--c5--b1-3c 的封包。如果 你想抓本机与所有外网通讯的数据包时,可以将这里的mac 地址换成路由的mac 地址即可。
src portrange // 捕捉来源为UDP 或 TCP ,并且端口号在 至 范围内的封包。
not imcp //显示除了icmp 以外的所有封包。 ( icmp 通常被 ping 工具使用)
src host and not dst net / //显示来源IP 地址为,但目的地不是/ 的封包。
(src host orsrc net /)and tcp dst portrange200-10000and dst net
/8 // 捕捉来源IP 为 或者来源网络为/ ,目的地TCP端口号在至 之间,并且目的位于网络/8 内的所有封包。
src net /
src net mask //捕捉源地址为 网络内的所有封包。 显示过滤器
例子:
snmp || dns || icmp // 显示 SNMP 或 DNS 或 ICMP 封包。
ip.addr == //显示来源或目的IP 地址为 的封包。
ip.src != or ip.dst != //显示来源不为 或者目的不为 的封包。 换句话说,显示的封包将会为:
来源 IP:除了 以外任意;
目的IP:任意
来源 IP:任意;
目的IP:除了 以外任意
ip.src != and ip.dst != //显示来源不为 并且目的IP 不为 的 封包。
换句话说,显示的封包将会为:
来源 IP:除了 以外任意;同时须满足,目的IP:除了 以外任意
tcp.port == // 显示来源或目的TCP 端口号为 的封包。 tcp.dstport == // 显示目的TCP 端口号为 的封包。 tcp.flags // 显示包含TCP 标志的封包。
tcp.flags.syn == 0× // 显示包含TCP SYN 标志的封包。 如果过滤器的语法是正确的,表达式的背景呈绿色。如果呈红色,说明表达式有误。
、TCPDUMP
tcpdump是一个运行在命令行 下的 嗅探工具。它允许用户拦截和显示发送或收到过网络 连 接到该计算机的TCP/IP 和其他数据包 。
tcpdump 采用命令行方式,它的命令格式为:
tcpdump [ -adeflnNOpqStvx ] [ -c数量] [ -F文件名]
[ -i网络接口] [ -r文件名 ] [ -s snaplen ] [ -T 类型] [ -w文件名] [ 表达式]
1、tcpdump 的选项介绍
-a将网络地址和广播地址转变成名字;
-d将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd将匹配信息包的代码以c 语言程序段的格式给出;
-ddd将匹配信息包的代码以十进制的形式给出;
-e在输出行打印出数据链路层的头部信息;
-f将外部的Internet 地址以数字的形式打印出来;
-l使标准输出变为缓冲行形式;
-n不把网络地址转换成名字;
-t在输出的每一行不打印时间戳;
-v输出一个稍微详细的信息,例如在ip 包中可以包括ttl 和服务类型的信息;
-vv输出详细的报文信息;
-c在收到指定的包的数目后,tcpdump 就会停止;
-F从指定的文件中读取表达式,忽略其它的表达式;
-i指定监听的网络接口;
-r从指定的文件中读取包(这些包一般通过-w 选项产生 );
-w直接将包写入文件中,并不分析和打印出来;
-T将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议; )
2、tcpdump 的表达式介绍
表达式是一个正则表达式,tcpdump 利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。
在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,net, port, 例如host ,指明 是一台主机,net 指明 是一个网络地址,port 指明端口号是。如果没有指定类型,缺省的类型是host。
第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src , 指明 ip 包中源地址是 , dst net 指明目的网络地址是 。如果没有指明方向关键字,则缺省是src or dst 关键字。
第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。 Fddi指明是在FDDI( 分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether" 的别名, fddi 和 ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether 的包进行处理和分析。 其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump 将会监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less, greater,还有三种逻辑运算,取非运算是'not ' '! ',与运算是 'and','&&'; 或运算是'or' ,'||';
说明。
这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来
(1)想要截获所有 的主机收到的和发出的所有的数据包:
#tcpdump host
(2) 想要截获主机 和主机 或 的通信,使用命令:(在命令行中适用括号时,一定要#tcpdump host and \ ( or \)
(3) 如果想要获取主机 除了和主机 之外所有主机通信的ip包,使用命令:
#tcpdump ip host and !
(4)如果想要获取主机 接收或发出的telnet 包,使用如下命令:
#tcpdump tcp port host
3、tcpdump 的输出结果介绍
下面我们介绍几种典型的tcpdump命令的输出信息
(1) 数据链路层头信息
使用命令 #tcpdump --e host ice
ice 是一台装有linux 的主机,她的MAC 地址是0:: : : AF : 1AH219 是一台装有SOLARIC的 SUN 工作站,它的MAC 地址是8: 0: :: 5B:;
上一条命令的输出结果如下所示:
:: eth0 < 8:0:::5b:::::af:1a ip : h219. > ice. telnet 0:0(0) ack win (DF)
分析: ::是显示的时间, 是 ID 号,eth0 <表示从网络接口eth0 接受该数据包, eth0 > 表示从网络接口设备发送数据包, 8:0:::5b: 是主机H219 的 MAC地址它表明是从源地址H219 发来的数据包. 0::::af:1a 是主机ICE 的 MAC 地址 ,表示该数据包的目的地址是ICE . ip是表明该数据包是IP 数据包 , 是数据包的长度, h219. > ice. telnet 表明该数据包是从主机H219 的 端口发往主机ICE 的 TELNET() 端口 . ack22535
表明对序列号是 的包进行响应. win 表明发送窗口的大小是.:1a)
(2) ARP 包的 TCPDUMP 输出信息
使用命令 #tcpdump arp
得到的输出结果是:
:: eth0 > arp who-has route tell ice (0::::af:1a)
:: eth0 < arp reply route is-at 0::::: (0::::af
分析 : :: 是时间戳 , 是 ID 号 , eth0 >表明从主机发出该数据包, arp 表明是ARP 请求包 , who-has route tell ice 表明是主机ICE 请求主机ROUTE的MAC地址。 0:::5
8:af:1a 是主机ICE的MAC地址。
(3) TCP 包的输出信息
用 TCPDUMP捕获的TCP 包的一般输出信息是:
src > dst: flags data-seqno ack window urgent options
src > dst:表明从源地址到目的地址, flags 是 TCP 包中的标志信息,S 是 SYN 标志 , F (F IN), P (PUSH) , R (RST) "." (没有标记 ); data-seqno 是数据包中的数据的顺序号, ack 是 下次期望的顺序号, window 是接收缓存的窗口大小, urgent 表明数据包中是否有紧急指针.
Options 是选项 .
(4) UDP 包的输出信息
用 TCPDUMP捕获的UDP 包的一般输出信息是:
route.port1 > ice.port2: udp lenth
UDP 十分简单,上面的输出行表明从主机ROUTE 的 port1 端口发出的一个UDP 数据 包到主机ICE 的 port2 端口,类型是UDP ,包的长度是lenth
3、抓包场景及步骤
机顶盒抓包
如果有需要抓机顶盒交互的报文,则可以通过HUB 和机顶盒连接进行抓包,可以通过windows的 wireshark 进行抓包,可以把所有交互的包抓下来,然后进行过滤分析,也可以通过过滤规则抓下来已经过滤后的包。
Linux下抓包
软终端在通过SS5代理服务器进行接入IPTV 环境时,可能需要到 SS5所在的代理服务器上去抓包,抓包方式就是通过TCPDUMP命令来抓取,一般我们把与IPTV网口相关的所有包都抓下来存为PCAP文件进行分析。
抓包命令为tcpdump -i eth1 -wxx.pcap,这样可以把抓过来的包保存到linux 服务器的用户登录当前文件夹下,然后通过SSH 传到本地进行分析,当然了也可以通过过滤规则抓包,详见TCPDUMP的常用命令。