分享

Tcpdump配合Tcpreplay回放实现网络探测

 guolijiegg 2012-02-23

Tcpdump配合Tcpreplay回放实现网络探测

122人阅读 评论(0) 收藏 举报
  • 实际上,这个需求来自IT的监控,监控的根本目标是随时发现局域网内的非法DHCP服务器,以报警。
  • 实现的具体策略:找一台机器,每分钟跑一次cron,执行检查并在出错时报警(邮件或者短信)。具体的核心策略是:模拟广播DHCP DISCOVER包,在规定时间内给出DHCP REPLY的就是当前有效的DHCP服务器,假设我们局域网内唯一合法的DHCP是192.168.1.1,当给出REPLY的主机列表中没有 192.168.1.1或者又其他的主机回复时,那就报警。整个策略的关键问题其实就是模拟广播DHCP DISCOVER包,其他的问题都很容易做。
  • 前提,不得不说,对于网络编程和C的libnet等库的理解非常少,所以首选的做法不是编写程序,而是打算找一个现成的发包工具。当然,现在想来如果使用 Perl的库来做这件事情似乎也并不难,只不过还没打算用这个办法,事情就已经解决了 smile
  • 为了避免说明有误解,我先把自己的测试环境说明一下:
 OS CentOS 4.7 Tcpdump rpm tcpdump-3.8.2-12.el4_6.1 tcpdump version 3.8 libpcap version 0.8.3 Tcpreplay rpm tcpreplay-3.3.2-1.el4.rf tcpreplay version: 3.3.2 (build 2065) Copyright 2001-2008 by Aaron Turner Cache file supported: 04 Not compiled with libnet. Compiled against libpcap: 0.8.3 64 bit packet counters: enabled Verbose printing via tcpdump: disabled Packet editing: enabled Fragroute engine: enabled

 

DHCP扫盲

 

 

尝试过程

  • 首先我们需要了解自己发送的包应该长成什么样子,最直接的思路就是tcpdump或者wireshark(升级版ethereal) 抓l来看看
# 这里是两个工具的抓包命令详解,当然,这里我们只简单介绍一下我们用到的几个参数
shell> tcpdump -s0 -vv -e -i eth0 -nn port 67 -c 100 -w yfang.cap
# -e: 打印连接层信息

# -vv: 打印详细信息
# -i eth0: 监听eth0网卡
# -nn:保留输出中的端口和协议使用数字格式
# -c 100:抓取满足条件的100个包,结束。否则会一直抓下去
# -s0: 这个参数对我们这次实验起着非常重要的作用,-s0表明不对包的尺寸进行裁剪,保持原来大小

# port 67: 不用多解释,因为DHCP协议主要是客户端与服务器端的67和68两个端口的信息交互
# -w yfang.cap: tcpdump默认把截获的包以文字形式输出到标准输出,-w参数强制按照cap格式输出到文件yfang.cap,用于后面我们replay
shell> wireshark
# 这个不用解释了,简单说一下,对于wireshark-gnome-1.0.3,filter格式会类似于“udp.port == 67”,而不支持以前的版本ethereal中 “port 67”这样的格式 # 另外一个问题,使用wireshark抓到很多包,如果想要保存其中选中的包,正解是:File->Save As->Selected packet only->写好文件名,保存就好了
  • 上面的命令是没有问题的,而在实验中开始没有加-s0参数,结果只截取到了一个不完整的包,导致后面replay失败。
  • 这里描述一下replay受挫详细过程
#首先截获一个DHCP包,注意,没有加-s0参数
root@S71[1]~15:28:04
# tcpdump -e -i eth0 -nn port 67 -c 1 -w yfang.cap
#接下来replay这个包,不做任何修改,这里只用了两个参数 -i eth0不解释了,-l 3表示连续发这个包3次,其实测试的话,发一次也OK
root@S71[1]~15:28:14
# tcpreplay -i eth0 -l 3 yfang.cap
sending out eth0 processing file: yfang.cap processing file: yfang.cap processing file: yfang.cap Actual: 3 packets (288 bytes) sent in 0.23 seconds Rated: 12007.5 bps, 0.09 Mbps/sec, 125.08 pps Statistics for network device: eth0 Attempted packets: 3 Successful packets: 3 Failed packets: 0 Retried packets (ENOBUFS): 0 Retried packets (EAGAIN): 0
# 花开两支,在刚才那个命令执行之前,先在另一台服务器S172上(其实同一台也OK,为的是表明局域网其他机器可以看到包)监听包 [root@S172 ~]
# tcpdump -i eth0 port 67 -c 10

tcpdump: verbose output suppressed, use -v or -vv for
# 我们注意到后面三行,三个奇怪的包,被truncate过了,这一点使用wireshark打开cap文件查看包的信息会看到下面这样的警告

# [Packet size limited during capture: BOOTP/DHCP truncated]
# 经过检查发现是-s参数的作用,加上-s0参数就好了
  • 现在我们已经知道怎么抓包了,如何简单区分DHCP各个包的具体信息呢,其实这一点上我个人推荐使用wireshark来分析,他不单会帮你抓好包,还会标明DHCP的标志信息,比如是DISCOVER,REQUEST,ACK,OFFER 等等。不用自己去分析标志位。即便如此,这里还是为感兴趣的朋友列一下DHCP Massage Type 的区别

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多