 | 跟踪网络数据包
跟踪应用程序代码可以揭示应用程序中正在发生的情况,能够查明系统正在执行的操作;但是,如果希望监视网络应用程序,希望了解正在通过网络传输哪些信息,那么该怎么办呢?有许多网络跟踪工具,Solaris 上的 snoop 工具、AIX 上的 iptrace 和适用于许多平台的 Ethereal 工具都可以查看网络上正在传输的数据包。
网络跟踪基础
跟踪网络数据包的几乎所有工具都采用相同的基本工作方式。一般情况下,计算机从网络读取数据包,但是只处理专门发送给这台计算机的网络数据包。在老式的以太网上,所有数据包发送给所有计算机。在使用网络交换机的情况下,如果希望查看发送给其他计算机的数据包,可能需要连接网络上的管理端口。
使用这些工具的方法和它们能够提供的信息有所差异,但是基本上是相同的。在 AIX 上,iptrace 是一个后台守护进程,所以必须通过显式地启动和停止工具来打开和关闭跟踪过程。启动它的命令是 # startsrc -s iptrace -a "-i tr0 /home/user/iptrace/log1"。停止它的命令是 # stopsrc -s iptrace。
在 Solaris 上,snoop 工具是一个根据需要执行的应用程序:# snoop。
但是,典型网络上的数据包数量非常大,可能很难动态地解码和显示它们。在这种情况下,可以通过设置端口名称或端口号、计算机名称或编号指定有限的扫描,也可以把原始数据输出到文件中,然后进一步处理这个文件。可以通过设置输出文件记录信息:$ snoop -o networkdump.log。
输入 $ snoop -i networkdump.log 读取保存的数据。
在使用 snoop 跟踪应用程序时,可能希望进行更有针对性的搜索。
用 snoop 扫描特定的主机
在跟踪期间,使用 snoop 的典型目的是了解应用程序是否正在通过网络进行通信,或者了解正在交换的具体信息。
例如,如果要诊断在 NFS 服务器和 NFS 客户机之间发生的问题,可能希望确认这两台计算机确实正在交换信息。一种方法是使用 snoop 监视交换的数据。在客户机上,可以使用 snoop 记录与服务器交换的数据。
例如,清单 17 查看主机 bear 的通信流。
清单 17. 查看主机 bear 的通信流
$ snoop host bear
Using device rge0 (promiscuous mode)
tweedledee.mcslp.pri -> bear.mcslp.pri TCP D=2049 S=1014 Syn Seq=1160567073
Len=0 Win=49640 Options=<mss 1460,nop,wscale 0,nop,nop,sackOK>
bear.mcslp.pri -> tweedledee.mcslp.pri TCP D=1014 S=2049 Syn Ack=1160567074
Seq=498630824 Len=0 Win=5840 Options=<mss 1460,nop,nop,sackOK,nop,wscale 7>
tweedledee.mcslp.pri -> bear.mcslp.pri TCP D=2049 S=1014 Ack=498630825
Seq=1160567074 Len=0 Win=49640
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C ACCESS3 FH=EC09 (read,lookup,
modify,extend,delete)
bear.mcslp.pri -> tweedledee.mcslp.pri TCP D=1014 S=2049 Ack=1160567230
Seq=498630825 Len=0 Win=54
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R ACCESS3 OK (read,lookup,modify,
extend,delete)
tweedledee.mcslp.pri -> bear.mcslp.pri TCP D=2049 S=1014 Ack=498630949
Seq=1160567230 Len=0 Win=49640
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=EC09
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri TCP D=2049 S=1014 Ack=498631065
Seq=1160567382 Len=0 Win=49640
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=02E4
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=8F7F
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=2764
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=FD7F
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=FF7F
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=8F7F
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=725E
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=8D7F
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=0C64
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=6CEC
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri NFS C GETATTR3 FH=5997
bear.mcslp.pri -> tweedledee.mcslp.pri NFS R GETATTR3 OK
tweedledee.mcslp.pri -> bear.mcslp.pri TCP D=2049 S=1014 Ack=498632341
Seq=1160569142 Len=0 Win=49640
|
可以看到正在交换数据。snoop 能够解码原始数据包的内容,从而判断实际交换的数据。在这里,NFS 使用 GETATTR3 网络数据包,它们提供文件的属性数据(比如名称、大小和所有者信息)。
这里显示了许多额外信息,所以还可以更明确地指定只选择 NFS 数据包。可以通过组合使用表达式指定要选择的数据,比如:$ snoop host bear and protocol nfs。
要想获得更详细的信息,可以用详细模式输出交换的实际数据。如果启用详细模式,snoop 会显示数据包的所有成分,包括原始以太网头数据以及 TCP 和协议信息。清单 18 给出在通过 NFS 请求文件系统状态数据时发送的一个数据包。
清单 18. 通过 NFS 请求文件系统状态数据时发送的一个数据包
ETHER: ----- Ether Header -----
ETHER:
ETHER: Packet 2 arrived at 16:09:4.99083
ETHER: Packet size = 142 bytes
ETHER: Destination = 0:1a:ee:1:1:c0,
ETHER: Source = 0:1d:60:1b:9a:2d,
ETHER: Ethertype = 0800 (IP)
ETHER:
IP: ----- IP Header -----
IP:
IP: Version = 4
IP: Header length = 20 bytes
IP: Type of service = 0x00
IP: xxx. .... = 0 (precedence)
IP: ...0 .... = normal delay
IP: .... 0... = normal throughput
IP: .... .0.. = normal reliability
IP: .... ..0. = not ECN capable transport
IP: .... ...0 = no ECN congestion experienced
IP: Total length = 128 bytes
IP: Identification = 61800
IP: Flags = 0x4
IP: .1.. .... = do not fragment
IP: ..0. .... = last fragment
IP: Fragment offset = 0 bytes
IP: Time to live = 64 seconds/hops
IP: Protocol = 6 (TCP)
IP: Header checksum = c7b7
IP: Source address = 192.168.0.2, bear.mcslp.pri
IP: Destination address = 192.168.0.5, tweedledee.mcslp.pri
IP: No options
IP:
TCP: ----- TCP Header -----
TCP:
TCP: Source port = 2049
TCP: Destination port = 1013 (Sun RPC)
TCP: Sequence number = 2161119694
TCP: Acknowledgement number = 1253508400
TCP: Data offset = 20 bytes
TCP: Flags = 0x18
TCP: 0... .... = No ECN congestion window reduced
TCP: .0.. .... = No ECN echo
TCP: ..0. .... = No urgent pointer
TCP: ...1 .... = Acknowledgement
TCP: .... 1... = Push
TCP: .... .0.. = No reset
TCP: .... ..0. = No Syn
TCP: .... ...0 = No Fin
TCP: Window = 348
TCP: Checksum = 0xec08
TCP: Urgent pointer = 0
TCP: No options
TCP:
RPC: ----- SUN RPC Header -----
RPC:
RPC: Record Mark: last fragment, length = 84
RPC: Transaction id = 485864481
RPC: Type = 1 (Reply)
RPC: This is a reply to frame 1
RPC: Status = 0 (Accepted)
RPC: Verifier : Flavor = 0 (None), len = 0 bytes
RPC: Accept status = 0 (Success)
RPC:
NFS: ----- Sun NFS -----
NFS:
NFS: Proc = 18 (Get filesystem statistics)
NFS: Status = 0 (OK)
NFS: Post-operation attributes: (not available)
NFS: Total space = 488217268224 bytes
NFS: Available space = 137675571200 bytes
NFS: Available space - this user = 112875532288 bytes
NFS: Total file slots = 60555264
NFS: Available file slots = 58563011
NFS: Available file slots - this user = 58563011
NFS: Invariant time = 0 sec
NFS:
|
查看特定的信息也有助于判断不同的应用程序正在执行的操作。例如,可能希望监视正在从某个主机访问哪些网站,那么可以搜索 HTTP 协议,只在 snoop 输出中输出 HTTP 行(见清单 19)。
清单 19. 监视正在从某个主机访问哪些网站
$ snoop -v port 80 |egrep '^HTTP'
...
HTTP: ----- HyperText Transfer Protocol -----
HTTP:
HTTP: GET / HTTP/1.0
HTTP: User-Agent: Wget/1.10.2
HTTP: Accept: */*
HTTP: Host: www.bbc.co.uk
HTTP: Connection: Keep-Alive
HTTP: [...]
...
|
egrep 只选择以 HTTP 开头的行。在这里可以看出有人访问了 BBC 网站。
|  |