[实践Ok]tcpdump的源码包安装方法,及通过tcpdump抓取HTTP包的方法,经常会用到的实用操作。

jackxiang 2013-5-31 10:28 | |
背景:
外包把代码放到我们的测试机上,有可能出现这样那样的调用问题,尽管前面说过要注意host配置的问题并记录,但是往往出现在上到测试机时,忘记了,于是用下tcpdump来抓包,可以实现有效的对其跨系统的接口进行跟踪,并找到问题之所在。
零:使用,方法一:
vi /root/.bashrc  

生效:
source /root/.bashrc
方法二(优点这个导出只是传的参数以&符号分割,而返回则全是body里的内容,相当的适合用作接口调试参数,用curl来进行组装访问。):

参考其优点细说在:http://jackxiang.com/post/7344/
特别说明:
tcpdump命令默认捕获包总长度是96字节,如图所示,我们只要在抓包命令里加一个参数 -s 0 即可捕获完整数据的数据包。
/usr/local/sbin/tcpdump -i any -p -s 0 -w /tmp/capture.pcap

一:安装
官网:http://www.tcpdump.org
下载两个包,注意配套,我的是:
http://www.tcpdump.org/release/libpcap-1.4.0.tar.gz
http://www.tcpdump.org/release/tcpdump-4.3.0.tar.gz
Add Time:2014-01-27,上面旧版本没问题,新的有问题:
wget http://www.tcpdump.org/release/tcpdump-4.5.1.tar.gz
wget http://www.tcpdump.org/release/libpcap-1.5.3.tar.gz
1 下载了libpcap-1.5.2.tar.gz。
2 tar -vxf libpcap-1.5.2.tar.gz
3 ./configure
4 make 发生错误。
1)安装:libpcap
cd /data/codesdev/libpcap/libpcap-1.6.1
./configure&&make && make install
理论上一次能过,但是往往会出现新的问题,如下:
[root@master libpcap-1.5.2]# make
gcc -fpic -I.  -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include   -DHAVE_CONFIG_H  -D_U_="__attribute__((unused))" -g -O2 -c ./pcap-dbus.c
./pcap-dbus.c: In function ‘dbus_write’:
./pcap-dbus.c:111: 错误:‘DBUS_ERROR_INIT’ 未声明 (在此函数内第一次使用)
./pcap-dbus.c:111: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
./pcap-dbus.c:111: 错误:所在的函数内只报告一次。)
./pcap-dbus.c: In function ‘dbus_activate’:
./pcap-dbus.c:165: 错误:‘DBUS_ERROR_INIT’ 未声明 (在此函数内第一次使用)
make: *** [pcap-dbus.o] 错误 1
按装dbus:
http://www.freedesktop.org/wiki/Software/dbus/
问题答案未实践来自:http://bbs.csdn.net/topics/390693013
######################我的情况如下######################
cc -fpic -I.  -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include   -DHAVE_CONFIG_H  -D_U_="__attribute__((unused))" -g -O2 -c ./pcap-linux.c
gcc -fpic -I.  -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include   -DHAVE_CONFIG_H  -D_U_="__attribute__((unused))" -g -O2 -c ./pcap-usb-linux.c
gcc -fpic -I.  -I/usr/include/dbus-1.0 -I/usr/lib64/dbus-1.0/include   -DHAVE_CONFIG_H  -D_U_="__attribute__((unused))" -g -O2 -c ./pcap-dbus.c
./pcap-dbus.c: In function ‘dbus_write’:
./pcap-dbus.c:111: error: ‘DBUS_ERROR_INIT’ undeclared (first use in this function)
./pcap-dbus.c:111: error: (Each undeclared identifier is reported only once
./pcap-dbus.c:111: error: for each function it appears in.)
./pcap-dbus.c: In function ‘dbus_activate’:
./pcap-dbus.c:165: error: ‘DBUS_ERROR_INIT’ undeclared (first use in this function)
make: *** [pcap-dbus.o] Error 1
#########################################################################
http://dbus.freedesktop.org/releases/dbus/

2)安装tcpdump:
cd /data/codesdev/libpcap/tcpdump-4.6.1
./configure&&make && make install

在centos6.4上安装后如下:
tcpdump --version
tcpdump version 4.6.1
libpcap version 1.6.1
OpenSSL 1.0.1e-fips 11 Feb 2013

二:通过tcpdump抓取HTTP包的方法,实践Ok:
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 为"GET"前两个字母"GE"
0x4854 为"HTTP"前两个字母"HT"
来自:http://zhumeng8337797.blog.163.com/blog/static/100768914201291110503529/
经过实践是可以的,特别是对接口的调试这一块很是有用,特记录如下:

解释:
0x4745 为"GET"前两个字母"GE"
0x4854 为"HTTP"前两个字母"HT"
实践如下:
[root@localhost ~]# tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854  -w /tmp/capture.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
8 packets captured
8 packets received by filter
0 packets dropped by kernel
[root@localhost ~]# sz /tmp/capture.pcap
[/codes]


三:通过网卡eth1来监听端口80发出去的host包到192.168.109.8的报文:
TcpDump位置: /usr/local/sbin/tcpdump
  
(0)最常用的:

(1)捕获队列的Http请求,不知道是哪个网卡于是得:-i any,根据端口和IP进行捕获:
curl "http://198.168.109.*:1218?charset=utf8&name=playRecord&opt=get",也就是目标是:198.168.109.*
生成如下捕获的tcpdump命令,经测试捕获是Ok的且可以用wireshark打开并查看到http的包:

如监控队列:

(2)加上源地址IP进行捕获:

所有包都截获后sz下来,并用Windows下的wireshark界面进行过滤查看http的包:


实践完全Ok,用wireshark能看到,并能导出:

wireshark界面使用备案Url:http://www.jackxiang.com/post/6262/

四:抓取发往某个指定IP的http get包数据指定文件进行输出package,这个也是下载到Windows下用wireshark界面过滤查看,实践用wireshark能看到:


实践如下:
[root@localhost ~]# tcpdump -XvvennSs 0 -i eth0 port 80 and dst host "192.168.109.8" and tcp[20:2]=0x4745 or tcp[20:2]=0x4854  -w /tmp/capture.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
Got 4

实践用wireshark打开能看到这些ip的http,实践Ok。

五:如何添加编译好的Tcpdump到到环境变量PATH中的方法:
http://www.jackxiang.com/post/1792/


Tcpdump的安装

在一些Linux发行版中,Tcpdump通常作为标准的软件包被默认安装,执行“tcpdump”命令能够确定是否已安装了Tcpdump。假如系统中还没有安装Tcpdump

1、下载地址

可到“http://www.tcpdump.org”下载最新的Tcpdump源码包。

注意:

因tcpdump的运行需要pcap的支持,所以最好先行安装pcap软件包,另外还要注意软件的版本问题,建议按照网站上匹配的软件包tcpdump和pcap一同下载。

前期在测试时我使用的yum 安装的pcap包(版本0.9.*),然后在网上下载了tcpdump(版本为4.3.0),在后期编译安装tcpdump时总是出错!!!后来我yum remove pcap  后重新使用源码包安装,一次成功!


2、下面以tcpdump-4.3.0.tar.gz    libpcap-1.3.0.tar.gz为例,讲述如何安装Tcpdump

此处使用的操作系统是 CentOS release 5.5 (Final)

在编译Tcpdump之前,应先确定pcap库(libpcap)已安装完毕。这个库是编译Tcpdump时所必需的。

安装过程非常简单如下示:

tar -zxvf libpcap-1.3.0.tar.gz

  cd libpcap-1.3.0

./configure

make

make install

该库已安装完毕,下面执行下面的命令来编译并安装Tcpdump:

tar -zxvf tcpdump-4.3.0.tar.gz

cd tcpdump-4.3.0

./configure

make
make install

来自:http://blog.itechol.com/space-33-do-blog-id-5780.html
64位的centos出现:
checking for capable lex... insufficient
configure: error: Your operating system's lex is insufficient to compile
libpcap.  flex is a lex replacement that has many advantages, including
being able to compile libpcap.  For more information, see
http://www.gnu.org/software/flex/flex.html .

yum install flex
...
Total download size: 286 k
Installed size: 724 k
Is this ok [y/N]:
Running Transaction
  Installing : flex-2.5.35-8.el6.x86_64                                                                                                                  1/1
  Verifying  : flex-2.5.35-8.el6.x86_64                                                                                                                  1/1

make
可能会遇到yacc错误:
yacc -d ./parse.y<br>make: yacc: Command not found<br>make: *** [parse.c] Error 127
解决方法:
yum install byacc
debian:
sudo apt-get install -y byacc
以上来自:
http://www.cnblogs.com/lynch_world/archive/2011/08/31/2160678.html

后记,发现安装的tcpdump不可用(因登录时shell用户不对造成默认Tcpdump的PATH不是/usr/sbin/,而是: /usr/local/sbin/,得用~/.bash_profile 里去掉加的/usr/local/sbin/:sudo su - 会默认到/usr/sbin/就行了。):


[root@localhost ~]# tcpdump -i any -p -s 0 -w /tmp/capture.pcap
tcpdump: error while loading shared libraries: libpcap.so.1: cannot open shared object file: No such file or directory
[root@localhost ~]# whoami
发现没有这个,应该有两个tcpdump:
[root@localhost ~]# ldd /usr/sbin/tcpdump
        libcrypto.so.6 => /lib64/libcrypto.so.6 (0x0000003bd9000000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003bd4800000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000003bd4c00000)
        libz.so.1 => /usr/lib64/libz.so.1 (0x0000003bd5c00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003bd4400000)

经检查,果然有两个,给那个不行的摘掉:
whereis tcpdump
tcpdump: /usr/sbin/tcpdump /usr/local/sbin/tcpdump

做下软链接:
cd /usr/local/sbin/
mv tcpdump tcpdump.libpcap.so.1.erro
ln -s /usr/sbin/tcpdump  tcpdump
tcpdump -> /usr/sbin/tcpdump

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6406/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2014-7-30 15:57
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]