TCP抓包-linux

(2012-01-09 16:07:45)

标签:

杂谈

linux如何抓包

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

from:

http://fanqiang.chinaunix.net/app/other/2006-07-14/4833.shtml

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 ice.

telne

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

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

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

(http://www.fanqiang.com)

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

from: http://bbs.51cto.com/archiver/tid-393595.html

cnhawk386http://www.51cto.com

2007-4-27 09:31

linux下有什么好的抓包工具

linux下有什么好的抓包工具

bluesea5920http://www.51cto.com

2007-4-28 00:32

tcpdump 一款不错的抓包工具

loniyhttp://www.51cto.com

2007-4-28 13:44

ethereal

fengtianlinghttp://www.51cto.com

2007-4-28 22:29

iptraf 这个你用用!也不错!

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

from: http://zhidao.baidu.com/question/55728353.html

如何在linux下编写抓包程序

悬赏分:50 - 解决时间:2008-6-23 15:43

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

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

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

提问者:

Tristanx

-

魔法师 五级

最佳答案

你用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: http://tech.ccidnet.com/art/302/20080109/1337045_1.html

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: http://unix-cd.com/vc/www/28/2007-11/9904.html

在linux进行抓包

2007-11-27 21:29 来源: www.linuxdiyf.com 作者: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:

http://topic.csdn.net/u/20081031/11/482b0257-a0b3-4c1c-94a9-c786e124c6f0.html

大家好:

我现在在用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: http://www.wangchao.net.cn/bbsdetail_67876.html

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");

}

}

分享:

喜欢

0

赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

linux下用套接字抓arp包,TCP抓包-linux相关推荐

  1. linux sock_raw原始套接字编程

    sock_raw原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket   1.socket(AF_INET, SOCK_R ...

  2. 原始套接字发送ARP数据包

    什么是ARP协议 ARP协议是Address Resolution Protocol(地址解析协议)的缩写.在局域网中,网络中实际传输的是数据帧,数据帧里面有目的主机的MAC地址.但这个目的MAC地址 ...

  3. Linux网络编程 - 套接字与协议族

    一 理解网络编程和套接字(socket) 1.1 网络编程和套接字概要 网络编程就是编程程序使两台连网的计算机可以互相交换数据.那么,这两台计算机之间用什么传输数据呢?首先需要物理连接.如今大部分计算 ...

  4. 《c语言从入门到精通》看书笔记——第16章 网络套接字编程(下)——套接字

    1.套接字概述 套接字是网络通信的基石,是网络通信的基本构件. 所谓套接字,实际上是一个指向传输提供者的句柄.在WinSock中,就是通过操作该句柄来实现网络通信和管理的.根据性质和作用不同,套接字可 ...

  5. linux编程本地套接字

    linux编程本地套接字 本地套接字是 IPC,也就是本地进程间通信的一种实现方式.除了本地套接字以外,其它技术,诸如管道.共享消息队列等也是进程间通信的常用方法,但因为本地套接字开发便捷,接受度高, ...

  6. 【Linux从青铜到王者】第十五篇:Linux网络编程套接字两万字详解

    系列文章目录 文章目录 系列文章目录 前言 一.网络数据的五元组信息 1.理解源IP地址和目的IP地址 2.理解 "端口号" 和 "进程ID" 3.理解源端口号 ...

  7. python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)

    文章目录 socket的定义 套接字的工作流程 socket函数使用 socket函数用法 服务端套接字函数 客户端套接字函数 公共用途的套接字函数 面向文件的套接字方法 打电话的流程演示 服务端.p ...

  8. Linux之socket套接字编程20160704

    介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...

  9. 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定

    众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...

  10. Linux IPv6 UDP套接字编程示例

    udp ipv6套接字编程和ipv4接口类似,参数略有不同,流程都包括创建套接字.绑定地址.发送等. 下面是一个udp ipv6 demo, 包括创建ipv6套接字.绑定地址和发送数据等. 首先先在l ...

最新文章

  1. 运算符及题目(2017.1.8)
  2. Oracle中的字符处理方法
  3. php v9 ajax 翻页,php ajax 无刷新翻页实现代码
  4. 用微信公众号做一个网页版商城
  5. JAVA时间日期处理类,主要用来遍历两个日期之间的每一天。
  6. 交互式计算机图形学总结:第五章 光照和明暗绘制
  7. Web前端培训分享:Web前端到底是什么?
  8. java 无类名实现接口_为什么很多人写 Java/Android 时,选择让同一个类实现多个接口,而不是用多个内部匿名类?...
  9. Spring Boot(09)——使用SpringMVC
  10. js 给动态li添加动态点击事件
  11. 用python内置函数算复杂度吗_Python减少代码量的两个内置函数
  12. 曝华为Mate 50正在测试:有望搭载骁龙898旗舰芯
  13. 分页的limit_Presto分页功能概述
  14. android p wifi一直在扫描_Android Wifi 扫描及自动连接
  15. AutoCAD2014下载和安装教程(官方中文完整版)
  16. 【Unity2D】Sprite 或图片格式常用设置
  17. Z05 - 046、工作流调度实现方式
  18. 学习笔记-基于全局和局部对比自监督学习的高分辨率遥感图像语义分割-day1
  19. 低通,高通,带通滤波器,π型滤波器的工作原理
  20. ZooKeeper 的 Watch 机制是什么?

热门文章

  1. 得力计算机1526弹音乐,得力1526计算器乐谱 | 手游网游页游攻略大全
  2. 现金支票打印模板excel_市政工程表格不会填?市政工程1000个表格模板,一键即可套用...
  3. 琴生Jensen不等式,条件期望
  4. Python飞机大战项目终篇(一步一步实现---最全笔记)
  5. 远程桌面:6个最实用技巧
  6. [3-6] xp系统主题下载最新xp系统软件更新 [yeskm整理]
  7. 样点自适应补偿(SAO)技术
  8. 拜占庭将军们的投票出了问题
  9. 如何用word制作逼真的手写字体?
  10. 2018iscc 河南线下 赛题 逆向部分题解