linux日志抓包,linux如何抓包

linux如何抓包

====================================================================

from:

linux下抓包命令--tcpdump的使用

来源:不详 (2006-07-14 11:09:04)

例:tcpdump host 172.16.29.40 and port 4600 -X -s 500

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 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的包进行处理和分析。

其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会

监听所有协议的信息包。

除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,

greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o

r' ,'||';

这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来

说明。

(1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:

#tcpdump host 210.27.48.1

(2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令

:(在命令行中适用   括号时,一定要

#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

(3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包

,使用命令:

#tcpdump ip host 210.27.48.1 and ! 210.27.48.2

(4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

#tcpdump tcp port 23 host 210.27.48.1

3. tcpdump 的输出结果介绍

下面我们介绍几种典型的tcpdump命令的输出信息

(1) 数据链路层头信息

使用命令#tcpdump --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.

telne

t 0:0(0) ack 22535 win 8760 (DF)

分析:21:50:12是显示的时间, 847509是ID号,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.

(2) ARP包的TCPDUMP输出信息

使用命令#tcpdump 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: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

()

====================================================================

from:

cnhawk3862007-4-27 09:31

linux下有什么好的抓包工具

linux下有什么好的抓包工具

bluesea59202007-4-28 00:32

tcpdump 一款不错的抓包工具

loniy2007-4-28 13:44

ethereal

fengtianling2007-4-28 22:29

iptraf 这个你用用!也不错!

====================================================================

from:

如何在linux下编写抓包程序

uid-20609878-id-1915752.html 悬赏分:50 - 解决时间:2008-6-23 15:43

在做一个项目,需要编写一个linux下的抓包程序。

虽然现在有很多流行的抓包程序,不过功能太复杂,我这个程序需要移植到嵌入式linux平台下面,需要越简单越好。

但对相关知识懂得不多,希望哪位能给点方向,或者说一下原理,多谢了!!!

提问者: -

最佳答案

你用SOCK_RAW的模式建立原始套接字然后接收包。

剩下的就全是分析内容的事情了。。。。最多再用一下多线程。

用到linux下socket编程的最基本知识, 以及对网络协议细节的了解。 前者随便找本socket编程的书就很详细了, 后者你因该懂。

——————

例如, 你需要include以下这些头:

stdio.h,stdlib.h, unistd.h, sys/socket.h, sys/types.h, netinet/if_ether.h, netinet/in.h,

然后建立socket的时候用

socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)),这样就能用这个socket来监听以太网的包。

然后循环调用recvfrom函数来听这个socket的接受到的数据, 再分析就好了。

如果要嗅探别人机器的包, 就要用ARP欺骗了。。呵呵

====================================================================

from:

Tcpdump:Linux下基于命令行的抓包工具

大家可能都已经对著名的抓包工具Ethereal比较熟悉了,这里再介绍一种基于命令行的抓包工具tcpdump。

举例:抓本机1813端口上的数据,并将抓包结果保存在test.cap文件中

tcpdump -X -s 0 -w test.cap port 1813

-X Print each packet (minus its link level header) in hex and ASCII.

-s snaplen Setting snaplen to 0 means use the required length to catch whole packets.

-w file Write the raw packets to file rather than parsing and printing them out.

然后在本地可以用Ethereal图形化界面查看所抓到包的详细信息。这在通过远程登录在服务器上工作的情况下特别有用,因为终端模式无法用图形化工具抓包。

(责任编辑:云子)

====================================================================

from:

在linux进行抓包

2007-11-27 21:29 来源: 作者:tinkage 网友评论 0 条 浏览次数 45

tcpdump -X -s 0 host xx.xx.xx.xx -w testfile.cap -i eth1

抓包命令:tcpdump

说明:在某个主机上进行抓,与主机xx.xx.xx.xx相互通信的数据包,其中-X -s0表示抓全包,-w testfile把抓好的包放在testfile文件中,-i eth1抓网卡eth1的。

====================================================================

from: http://www.blogjava.net/josson/archive/2008/01/21/176774.html

Linux 抓包分析工具。

tcpdump是一个Sniffer工具,实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。一般系统都默认安装。相关介绍及安装说明可参见: Tcpdump的安装和使用。

tcpdump命令说明:

tcpdump采用命令行方式,它的命令格式为:

tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]

[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]

[ -T 类型 ] [ -w 文件名 ] [表达式 ]

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(简单       网络管理协议;)

-s      设置抓包大小限制,默认抓包大小限制在96个BYTE(包括以太网帧)。修改参数为:-s 0。0 则忽略包的大小限制,按包的长度实际长度抓取。

例:tcpdump -vv tcp port 5270 -c 100 -s 1500 -w /opt/sniffer.pack

====================================================================

from:

大家好:

我现在在用uclinux中做一个类似路由器的功能,我的板子上有两个网口,需要从一个网口抓得数据包,进行一些分析再由另一个网口送出。请问高手,像这种在嵌入式linux中做抓包和分析包的工作有没有一些现成的工具啊,或者哪们高手给提供一些思路,我也不胜感激啊。

我知道在PC机的linux系统中有Tcpdump之类的抓包工具,但是我不知道能不能把这种工具移植到嵌入式linux中去,如果可以的话还请哪们大侠指点一二。

问题点数:10 回复次数:9 修改 删除 举报 引用 回复

发表于:2008-10-31 12:31:061楼 得分:0

有sniffit工具可用

发表于:2008-10-31 12:48:132楼 得分:0

Wireshark (Formerly Ethereal)

发表于:2008-10-31 14:26:143楼 得分:0

不太明白你的意思  我想原理是一样

tcpdump命令 抓包下来去分析了

发表于:2008-11-01 15:06:054楼 得分:0

你好,这些Wireshark和Tcpdump之类的工具不都是基于命令行的吗,它们能不能通过C语言调用啊,因为我要在嵌入式系统中来实现这个功能,最终的目标是要一上电就要自动运行,即自动的抓包,分析,并且送向另一个网口,由于是linux新手,很多不懂的地方,还请多多指点啊

发表于:2008-11-02 10:50:465楼 得分:0

帖子要沉了,自己顶一下

关于tcpdump我还有个疑问,就是它是不是只能截到数据包的头信息啊,我想得到数据包中的数据部分tcpdump能截到吗

发表于:2008-11-03 09:36:036楼 得分:0

路过,帮顶,以后也许用得着

发表于:2008-11-11 21:08:307楼 得分:10

抓包可以使用Linux Libpcap库,组包可以用Libnet库。都可以移植到uclinux上去的。

记得把内核的IP_FOWARD设为0,否则抓包会有问题。

发表于:2008-11-12 09:00:248楼 得分:0

Wireshark ,好东西,支持linux

发表于:2008-11-20 08:37:539楼 得分:0

噢,谢谢,

就此结帖,以后有问题还得再行请教啊

====================================================================

from:

linux下用socket的抓包程序

-

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void die(char *why, int n)

{

perror(why);

exit(n);

}

int do_promisc(char *nif, int sock )

{

struct ifreq ifr;

strncpy(ifr.ifr_name, nif,strlen(nif)+1);

if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) //获得flag

{

die("ioctl", 2);

}

ifr.ifr_flags |= IFF_PROMISC; //重置flag标志

if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 ) //改变模式

{

die("ioctl", 3);

}

}

//修改网卡成PROMISC(混杂)模式

char buf[40960];

main()

{

struct sockaddr_in addr;

struct ether_header *peth;

struct iphdr *pip;

struct tcphdr *ptcp;

struct udphdr *pudp;

char mac[16];

int i,sock, r, len;

char *data;

char *ptemp;

char ss[32],dd[32];

if((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) //建立socket

//man socket可以看到上面几个宏的意思

{

die("socket", 1);

}

do_promisc("eth0", sock); //eth0为网卡名称

system("ifconfig");

for(;;)

{

len = sizeof(addr);

r = recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len);

//调试的时候可以增加一个输出r的语句判断是否抓到包

buf[r] = 0;

ptemp = buf;

peth = (struct ether_header *)ptemp;

ptemp += sizeof(struct ether_header); //指针后移eth头的长度

pip = (struct ip *)ptemp; //pip指向ip层的包头

ptemp += sizeof(struct ip);//指针后移ip头的长度

switch(pip->protocol) //根据不同协议判断指针类型

{

case IPPROTO_TCP:

ptcp = (struct tcphdr *)ptemp; //ptcp指向tcp头部

printf("TCP pkt :FORM:[%s]:[%d]\n",inet_ntoa(*(struct in_addr*)&(pip->saddr)),ntohs(ptcp->source));

printf("TCP pkt :TO:[%s]:[%d]\n",inet_ntoa(*(struct in_addr*)&(pip->daddr)),ntohs(ptcp->dest));

break;

case IPPROTO_UDP:

pudp = (struct udphdr *)ptemp; //ptcp指向udp头部

printf("UDP pkt:\n len:%d payload len:%d from %s:%d to %s:%d\n",

r,

ntohs(pudp->len),

inet_ntoa(*(struct in_addr*)&(pip->saddr)),

ntohs(pudp->source),

inet_ntoa(*(struct in_addr*)&(pip->daddr)),

ntohs(pudp->dest)

);

break;

case IPPROTO_ICMP:

printf("ICMP pkt:%s\n",inet_ntoa(*(struct in_addr*)&(pip->saddr)));

break;

case IPPROTO_IGMP:

printf("IGMP pkt:\n");

break;

default:

printf("Unkown pkt, protocl:%d\n", pip->protocol);

break;

} //end switch

perror("dump");

}

}

/*

[playmud@fc3 test]$ gcc -v

Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.2/specs

Configured with: ../configure --prefix=/usr --mandir=/usr/share/man

--infodir=/usr/share/info --enable-shared --enable-threads=posix

--disable-checking --with-system-zlib --enable-__cxa_atexit

--disable-libunwind-exceptions --enable-java-awt=gtk

--host=i386-redhat-linux

Thread model: posix

gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)

************************eth的结构**************************************

struct ether_header

{

u_int8_t ether_dhost[ETH_ALEN]; // destination eth addr

u_int8_t ether_shost[ETH_ALEN]; // source ether addr

u_int16_t ether_type; // packet type ID field

} __attribute__ ((__packed__));

***********************IP的结构***********************************

struct iphdr

{

#if __BYTE_ORDER == __LITTLE_ENDIAN

unsigned int ihl:4;

unsigned int version:4;

#elif __BYTE_ORDER == __BIG_ENDIAN

unsigned int version:4;

unsigned int ihl:4;

#else

# error "Please fix "

#endif

u_int8_t tos;

u_int16_t tot_len;

u_int16_t id;

u_int16_t frag_off;

u_int8_t ttl;

u_int8_t protocol;

u_int16_t check;

u_int32_t saddr;

u_int32_t daddr;

};

***********************TCP的结构****************************

struct tcphdr

{

u_int16_t source;

u_int16_t dest;

u_int32_t seq;

u_int32_t ack_seq;

# if __BYTE_ORDER == __LITTLE_ENDIAN

u_int16_t res1:4;

u_int16_t doff:4;

u_int16_t fin:1;

u_int16_t syn:1;

u_int16_t rst:1;

u_int16_t psh:1;

u_int16_t ack:1;

u_int16_t urg:1;

u_int16_t res2:2;

# elif __BYTE_ORDER == __BIG_ENDIAN

u_int16_t doff:4;

u_int16_t res1:4;

u_int16_t res2:2;

u_int16_t urg:1;

u_int16_t ack:1;

u_int16_t psh:1;

u_int16_t rst:1;

u_int16_t syn:1;

u_int16_t fin:1;

# else

# error "Adjust your defines"

# endif

u_int16_t window;

u_int16_t check;

u_int16_t urg_ptr;

};

***********************UDP的结构*****************************

struct udphdr

{

u_int16_t source;

u_int16_t dest;

u_int16_t len;

u_int16_t check;

};

*************************************************************

*/

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

====================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值