tcpdump抓包脚本
python调用tcpdump抓包过滤的方法

python调⽤tcpdump抓包过滤的⽅法本⽂实例为⼤家分享了python调⽤tcpdump抓包过滤的具体代码,供⼤家参考,具体内容如下之前在linux⽤python脚本写⼀个抓包分析⼩⼯具,实在不想⽤什么libpcap、pypcap所以,简单来了个tcpdump加grep搞定。
基本思路是分别起tcpdump和grep两个进程,进程直接通过pipe交换数据,简单代码如下:#! /usr/bin/pythondef tcpdump():import subprocess, fcntl, os# sudo tcpdump -i eth0 -n -s 0 -w - | grep -a -o -E "Host: .*|GET /.*"cmd1 = ['tcpdump', '-i', 'eth0', '-n','-B', '4096','-s', '0', '-w', '-']cmd2 = ['grep', '--line-buffered', '-a', '-o', '-E', 'Host: .*|GET /.*']p1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)p2 = subprocess.Popen(cmd2, stdout=subprocess.PIPE, stdin=p1.stdout)flags = fcntl.fcntl(p2.stdout.fileno(), fcntl.F_GETFL)fcntl.fcntl(p2.stdout.fileno(), fcntl.F_SETFL, (flags | os.O_NDELAY | os.O_NONBLOCK))return p2def poll_tcpdump(proc):#print 'poll_tcpdump....'import selecttxt = Nonewhile True:# wait 1/10 secondreadReady, _, _ = select.select([proc.stdout.fileno()], [], [], 0.1)if not len(readReady):breaktry:for line in iter(proc.stdout.readline, ""):if txt is None:txt = ''txt += lineexcept IOError:print 'data empty...'passbreakreturn txtproc = tcpdump()while True:text = poll_tcpdump(proc)if text:print '>>>> ' + text运⾏效果:其中值得注意tcpdump中'-B', '4096'这个参数,官⽅⽂档貌似没有明确提及,但是它是你解决丢包的关键地⽅之⼀,当然还有-s这个参数也得好好利⽤!其他的⼤家可以⾃由发挥!以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
tcpdump抓包

tcpdump 必须使用 root 的身份执行[root@linux ~]# tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae][-qX] [-r 档案] [所欲撷取的数据内容]参数:-nn:直接以 IP 及 port number 显示,而非主机名与服务名称-i :后面接要『监听』的网络接口,例如 eth0, lo, ppp0 等等的界面;-w :如果你要将监听所得的封包数据储存下来,用这个参数就对了!后面接档名-c :监听的封包数,如果没有这个参数, tcpdump 会持续不断的监听,直到使用者输入 [ctrl]-c 为止。
-A :封包的内容以 ASCII 显示,通常用来捉取 WWW 的网页封包资料。
-e :使用资料连接层 (OSI 第二层) 的 MAC 封包数据来显示;-q :仅列出较为简短的封包信息,每一行的内容比较精简-X :可以列出十六进制 (hex) 以及 ASCII 的封包内容,对于监听封包内容很有用-r :从后面接的档案将封包数据读出来。
那个『档案』是已经存在的档案,并且这个『档案』是由 -w 所制作出来的。
所欲撷取的数据内容:我们可以专门针对某些通讯协议或者是 IP 来源进行封包撷取,那就可以简化输出的结果,并取得最有用的信息。
常见的表示方法有:'host foo', 'host 127.0.0.1' :针对单部主机来进行封包撷取'net 192.168' :针对某个网域来进行封包的撷取;'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制'tcp port 21':还可以针对通讯协议侦测,如 tcp, udp, arp, ether 等还可以利用 and 与 or 来进行封包数据的整合显示呢!范例一:以121.9.240.130这台测试机为基础.[root@linux ~]# tcpdump09:25:40.856970 IP 59.37.164.34.12670 > 121.9.222.91.15649: UDP, length 8209:25:40.857025 IP 121.9.222.64.15583 > .3001: UDP, length 8209:25:40.857026 IP 121.9.223.171.25511 > 222.223.23.168.2471: P 1681367693:1681367882(189) ack 169128214 win 6545509:25:40.857027 IP 121.9.222.182.15502 > 218.15.245.162.16059: UDP, length 14 09:25:40.857068 IP 119.132.101.206.3001 > 121.9.222.183.15164: UDP, length 82 09:25:40.857118 IP 121.9.222.175.15693 > 202.101.190.242.3001: UDP, length 82 09:25:40.857119 IP 121.9.222.175.15693 > 202.101.190.242.3001: UDP, length 82 09:25:40.857121 IP 59.34.127.210.43659 > 121.9.222.243.15716: UDP, length 14 09:25:40.857122 IP 121.9.222.87.15030 > 119.132.101.206.3001: UDP, length 14 09:25:40.857123 IP 121.9.222.88.15278 > 113.14.161.238.3001: UDP, length 14 09:25:40.857170 IP .3001 > 121.9.222.93.15400: UDP, length 1409:25:40.857218 IP 58.242.202.10.3001 > 121.9.222.87.15300: UDP, length 1009:25:40.857219 IP .3001 > 121.9.222.242.14920: UDP, length 18186 packets captured1293913 packets received by filter1293348 packets dropped by kernel按下 [ctrl]-c 之后结束186 packets captured <==捉下来的封包数量1293913 packets received by filter <==由过滤所得的总封包数量1293348 packets dropped by kernel <==被核心所丢弃的封包以红色标记的为例09:25:40.857027:这个是此封包被撷取的时间,『时:分:秒』的单位;IP:透过的通讯协议是 IP ;121.9.222.88.15278 > :传送端是 121.9.222.88 这个 IP,而传送的端口为 15278,那个大于 (>) 的符号指的是封包的传输方向!113.14.161.238.3001:接收端的 IP 是 113.14.161.238,且该主机开启端口 3001 来接收;UDP, length 10只得是传输的协议和长度只监听80端口[root@linux ~]# tcpdump -nn port 8009:52:14.508478 IP 121.9.223.242.80 > 61.152.150.162.55954: P 0:233(233) ack 1 win 172809:52:14.508481 IP 121.9.223.242.80 > 61.152.150.162.55954: F 233:233(0) ack 1 win 172809:52:14.536334 IP 121.9.223.242.80 > 61.152.150.162.55954: . ack 2 win 1728 09:52:14.563288 IP 121.9.222.104.80 > 61.152.150.152.40709: . ack 2223535384 win 172809:52:14.568035 IP 121.9.222.104.80 > 61.152.150.152.40709: P 0:231(231) ack 1 win 172809:52:14.568180 IP 121.9.222.104.80 > 61.152.150.152.40709: F 231:231(0) ack 1 win 172809:52:14.596534 IP 121.9.222.104.80 > 61.152.150.152.40709: . ack 2 win 1728 09:52:18.123972 IP 121.9.222.203.80 > 61.152.150.133.57066: . ack 1914833392 win 5409:52:18.127865 IP 121.9.222.203.80 > 61.152.150.133.57066: P 0:210(210) ack 1 win 5409:52:18.127867 IP 121.9.222.203.80 > 61.152.150.133.57066: F 210:210(0) ack 1 win 54只监听一台主机[root@linux ~]# tcpdump –nn host 121.9.240.13010:03:36.924444 IP 121.9.240.130.22 > 218.13.39.225.60867: P 121872:122004(132) ack 469 win 13810:03:36.927825 IP 218.13.39.225.60867 > 121.9.240.130.22: . ack 115732 win 4648410:03:36.927832 IP 121.9.240.130.22 > 218.13.39.225.60867: P 122004:122300(296) ack 469 win 13810:03:36.927884 IP 121.9.240.130.22 > 218.13.39.225.60867: P 122300:122432(132) ack 469 win 13810:03:36.930520 IP 218.13.39.225.60867 > 121.9.240.130.22: . ack 116160 win 46537 10:03:36.930527 IP 121.9.240.130.22 > 218.13.39.225.60867: P 122432:122728(296) ack 469 win 13810:03:36.930583 IP 121.9.240.130.22 > 218.13.39.225.60867: P 122728:122860(132) ack 469 win 13810:03:36.935176 IP 121.9.240.130.22 > 218.13.39.225.60867: P 122860:123156(296) ack 521 win 138。
tcpdump抓包基本命令

抓取vpn的数据包 用命令ifconfig 查看vpn接口的名称,一般是"vpntun"
tcpdump vpntun
抓取vlan的数据包
tcpdump -i eth0 host 192.168.1.1 and host 172.16.1.1
参数”or“的使用
tcpdump -i eth0 host 192.168.1.1 and host 172.16.1.1 -nn
以IP和端口号显示数据包
//抓取eth0接口,IP为192.168.1.1和172.16.1.1,源IP和目的IP只要是这个两个IP中的一个就可以被抓取到
tcpdump -i 接口名称 host IP地址
//抓取eth0接口 IP是192.168.1.1 ,不区分源IP和目的IP
例如:tcpdump -i eth0 host 192.168.1.1
参数"and"的使用
//抓取eth0接口,IP为192.168.1.1和172.16.1.1,源IP和目的IP都要是这两个IP中的
tcpdump -i eth0 host 192.168.1.1 and host 172.16.1.1 -nn
把抓取的数据包存放在目录/tmp/下面,命名 XXX.cap 或XXX.pcap,抓包之后就可以看到 /tmp/XXX.cap 的文件
tcpdump -i eth0 host 192.168.1.1 and host 172.16.1.1 -nn -s0 -w /tmp/XXX.cap
CentOS下使用tcpdump网络抓包

CentOS下使⽤tcpdump⽹络抓包tcpdump是Linux下的截获分析⽹络数据包的⼯具,对优化系统性能有很⼤参考价值。
安装tcpdump不是默认安装的,在CentOS下安装:yum install tcpdump在Ubuntu下安装:apt-get install tcpdump默认启动tcpdump普通情况下,直接启动tcpdump将监视第⼀个⽹络接⼝上所有流过的数据包。
监视指定⽹络接⼝的数据包(⼀定要查看⽹卡)tcpdump -i eth1如果不指定⽹卡,默认tcpdump只会监视第⼀个⽹络接⼝,⼀般是eth0,下⾯的例⼦都没有指定⽹络接⼝。
监视指定主机的数据包打印所有进⼊或离开sundown的数据包.tcpdump host sundown也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包tcpdump host 210.27.48.1打印helios 与 hot 或者与 ace 之间通信的数据包tcpdump host helios and \( hot or ace \)截获主机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 \)打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.tcpdump ip host ace and not helios如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使⽤命令:tcpdump ip host 210.27.48.1 and ! 210.27.48.2截获主机hostname发送的所有数据tcpdump -i eth0 src host hostname监视所有送到主机hostname的数据包tcpdump -i eth0 dst host hostname监视指定主机和端⼝的数据包如果想要获取主机210.27.48.1接收或发出的telnet包,使⽤如下命令tcpdump tcp port 23 and host 210.27.48.1对本机的udp 123 端⼝进⾏监视 123 为ntp的服务端⼝tcpdump udp port 123监视指定⽹络的数据包打印本地主机与Berkeley⽹络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为'Berkeley⽹络'的⽹络地址,此表达式最原始的含义可表达为: 打印⽹络地址为ucb-ether的所有数据包)tcpdump net ucb-ether打印所有通过⽹关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防⽌shell对其中的括号进⾏错误解析)tcpdump 'gateway snup and (port ftp or ftp-data)'打印所有源地址或⽬标地址是本地主机的IP数据包(如果本地⽹络通过⽹关连到了另⼀⽹络, 则另⼀⽹络并不能算作本地⽹络.(nt: 此句翻译曲折,需补充).localnet 实际使⽤时要真正替换成本地⽹络的名字)tcpdump ip and not net localnet监视指定协议的数据包打印TCP会话中的的开始和结束数据包, 并且数据包的源或⽬的不是本地⽹络上的主机.(nt: localnet, 实际使⽤时要真正替换成本地⽹络的名字))tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'打印所有源或⽬的端⼝是80, ⽹络层协议为IPv4, 并且含有数据,⽽不是SYN,FIN以及ACK-only等不含数据的数据包.(ipv6的版本的表达式可做练习)tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'(nt: 可理解为, ip[2:2]表⽰整个ip数据包的长度, (ip[0]&0xf)<<2)表⽰ip数据包包头的长度(ip[0]&0xf代表包中的IHL域, ⽽此域的单位为32bit, 要换算成字节数需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表⽰tcp头的长度, 此域的单位也是32bit, 换算成⽐特数为 ((tcp[12]&0xf0) >> 4) << 2, 即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表⽰: 整个ip数据包的长度减去ip头的长度,再减去tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本只需考虑ipv6头中的'Payload Length' 与 'tcp头的长度'的差值, 并且其中表达⽅式'ip[]'需换成'ip6[]'.)打印长度超过576字节, 并且⽹关地址是snup的IP数据包tcpdump 'gateway snup and ip[2:2] > 576'打印所有IP层⼴播或多播的数据包,但不是物理以太⽹层的⼴播或多播数据报tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'打印除'echo request'或者'echo reply'类型以外的ICMP数据包( ⽐如,需要打印所有⾮ping 程序产⽣的数据包时可⽤到此表达式 .(nt: 'echo reuqest' 与 'echo reply' 这两种类型的ICMP数据包通常由ping程序产⽣))tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'tcpdump 与wiresharkWireshark(以前是ethereal)是Windows下⾮常简单易⽤的抓包⼯具。
Linux抓包工具tcpdump命令详解

Linux抓包⼯具tcpdump命令详解1、简介⽤简单的话来定义tcpdump,就是:dump the traffic on a network,根据使⽤者的定义对⽹络上的数据包进⾏截获的包分析⼯具。
tcpdump可以将⽹络中传送的数据包的“头”完全截获下来提供分析。
它⽀持针对⽹络层、协议、主机、⽹络或端⼝的过滤,并提供and、or、not等逻辑语句来帮助你去掉⽆⽤的信息。
2、实⽤命令实例1)默认启动tcpdump普通情况下,直接启动tcpdump将监视第⼀个⽹络接⼝上所有流过的数据包。
2)监视指定⽹络接⼝的数据包 tcpdump -i eth1如果不指定⽹卡,默认tcpdump只会监视第⼀个⽹络接⼝,⼀般是eth0,下⾯的例⼦都没有指定⽹络接⼝。
3)监视指定主机的数据包打印所有进⼊或离开sundown的数据包:tcpdump host sundown也可以指定ip,例如截获所有210.27.48.1的主机收到的和发出的所有的数据包:tcpdump host 210.27.48.1打印helios与hot或者与ace之间通信的数据包:tcpdump host helios and \( hot or ace \)截获主机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 \)打印ace与任何其他主机之间通信的IP数据包, 但不包括与helios之间的数据包:tcpdump ip host ace and not helios如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使⽤命令:tcpdump ip host 210.27.48.1 and ! 210.27.48.2截获主机hostname发送的所有数据:tcpdump -i eth0 src host hostname监视所有送到主机hostname的数据包:tcpdump -i eth0 dst host hostname4)监视指定主机和端⼝的数据包如果想要获取主机210.27.48.1接收或发出的telnet包,使⽤如下命令:tcpdump tcp port 23 host 210.27.48.1对本机的udp 123 端⼝进⾏监视123为ntp的服务端⼝:tcpdump udp port 1235)监视指定⽹络的数据包打印本地主机与Berkeley⽹络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为'Berkeley⽹络'的⽹络地址,此表达式最原始的含义可表达为: 打印⽹络地址为ucb-ether的所有数据包):tcpdump net ucb-ether打印所有通过⽹关snup的ftp数据包:(注意,表达式被单引号括起来了,这可以防⽌shell对其中的括号进⾏错误解析)tcpdump 'gateway snup and (port ftp or ftp-data)'6)监视指定协议的数据包打印TCP会话中的的开始和结束数据包,并且数据包的源或⽬的不是本地⽹络上的主机:(nt: localnet, 实际使⽤时要真正替换成本地⽹络的名字)tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'打印所有源或⽬的端⼝是80,⽹络层协议为IPv4,并且含有数据,⽽不是SYN,FIN以及ACK-only等不含数据的数据包:(ipv6的版本的表达式可做练习)tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'(nt: 可理解为, ip[2:2]表⽰整个ip数据包的长度, (ip[0]&0xf)<<2)表⽰ip数据包包头的长度(ip[0]&0xf代表包中的IHL域, ⽽此域的单位为32bit, 要换算成字节数需要乘以4,即左移2.(tcp[12]&0xf0)>>4 表⽰tcp头的长度, 此域的单位也是32bit, 换算成⽐特数为 ((tcp[12]&0xf0) >> 4) << 2, 即((tcp[12]&0xf0)>>2).((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表⽰: 整个ip数据包的长度减去ip头的长度,再减去tcp头的长度不为0,这就意味着, ip数据包中确实是有数据。
9个tcpdump使用实例

9个tcpdump使⽤实例tcpdump能帮助我们捕捉并保存⽹络包,保存下来的⽹络包可⽤于分析⽹络负载情况,包可通过tcpdump命令解析,也可以保存成后缀为pcap的⽂件,使⽤wireshark等软件进⾏查看。
以下将给出9个使⽤tcpdump的例⼦,以说明tcpdump的具体使⽤⽅法。
1.针对特定⽹⼝抓包(-i选项)当我们不加任何选项执⾏tcpdump时,tcpdump将抓取通过所有⽹⼝的包;使⽤-i选项,我们可以在某个指定的⽹⼝抓包:linux:/tmp/lx # tcpdump -i eth0tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes10:50:28.607429 IP 10.70.121.92.autodesk-lm > 10.71.171.140.ssh: . ack 116 win 6495110:50:28.607436 IP 10.71.171.140.ssh > 10.70.121.92.autodesk-lm: P 116:232(116) ack 1 win 1286410:50:30.384195 arp who-has 128.128.128.35 tell 128.128.128.35以上例⼦中,tcpdump抓取所有通过eth0的包。
2.抓取指定数⽬的包(-c选项)默认情况下tcpdump将⼀直抓包,直到按下”ctrl+c”中⽌,使⽤-c选项我们可以指定抓包的数量:linux:/tmp/lx # tcpdump -c 2 -i eth0tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes10:58:05.656104 IP 10.71.171.140.ssh > 10.70.121.92.autodesk-lm: P 1210443473:1210443589(116) ack 2583117929 win 1286410:58:05.657074 IP 10.70.121.92.autodesk-lm > 10.71.171.140.ssh: . ack 116 win 652112 packets captured6 packets received by filter0 packets dropped by kernel以上例⼦中,只针对eth0⽹⼝抓2个包。
使用tcpdump命令捕获和分析网络数据包

使用tcpdump命令捕获和分析网络数据包在网络中,数据包是网络通信的基本单位。
了解和分析网络数据包的内容和结构,对于网络管理员和安全专家来说是非常重要的。
tcpdump是一款功能强大的网络数据包分析工具,它能够捕获网络数据包并提供详细的分析信息。
本文将介绍如何使用tcpdump命令捕获和分析网络数据包。
一、安装tcpdump在开始使用tcpdump之前,首先需要在你的计算机上安装tcpdump。
tcpdump在大多数Linux和UNIX系统中都是默认安装的,可以使用以下命令来检查是否已经安装了tcpdump:```tcpdump -v```如果已经安装,则会显示tcpdump的版本信息;如果未安装,则需要使用以下命令来安装tcpdump:```sudo apt-get install tcpdump```二、捕获网络数据包使用tcpdump捕获网络数据包非常简单,只需在终端中输入以下命令:```sudo tcpdump```该命令将会开始捕获所有经过计算机网络接口的数据包。
然而,这样会产生大量的输出信息,不便于分析。
为了提高分析效率,可以使用一些选项来限制捕获的数据包范围。
1. 指定网络接口如果你有多个网络接口,可以使用-i选项指定要捕获的网络接口。
例如,要捕获eth0接口的数据包,可以使用以下命令:```sudo tcpdump -i eth0```2. 指定捕获数量使用-c选项可以指定要捕获的数据包数量。
例如,要只捕获10个数据包,可以使用以下命令:```sudo tcpdump -c 10```3. 指定捕获过滤器可以使用过滤器来指定要捕获的数据包类型。
例如,要只捕获HTTP协议的数据包,可以使用以下命令:```sudo tcpdump port 80```以上命令将只捕获目标端口为80的数据包。
三、分析网络数据包捕获到网络数据包后,可以使用tcpdump提供的一些选项来进行数据包分析。
tcpdump抓包常用命令列举

tcpdump抓包常⽤命令列举情形⼀、采集指定⽹络接⼝和端⼝的数据包sudo tcpdump -s 0 -x -n -tttt -i bond0 port 55944 -w /tmp/mysql_tmp.tcp情形⼆、采集指定ip(来源或⽬标)和⽹络接⼝的数据包sudo tcpdump -s 0 -x -n -tttt -i bond0 host 10.15.189.191 -w /tmp/mysql_3.tcp情形三、采集多个ip(来源或⽬标)和⽹络接⼝的数据包sudo tcpdump -s 0 -x -n -tttt -i bond0 \(host 192.168.1.10 or host 192.168.1.11\) -w /tmp/mysql_3.tcpps:使⽤()⼀定要⽤ \ 转义。
情形四、采集指定协议、⽹络接⼝和端⼝的数据包sudo tcpdump -s 0 -x -n -tttt tcp -i eth0 port 55944 -w /tmp/mysql_tmp1.tcpsudo tcpdump -s 0 port 55944 and dst 10.15.72.125 -x -n -tttt -C 256 -w /tmp/tcpdump_$(date +"%Y%m%d-%H%M%S").pcap tcpdump过滤语句介绍:过滤表达式⼤体可以分成三种过滤条件,“类型”、“⽅向”和“协议”,这三种条件的搭配组合就构成了我们的过滤表达式。
1、关于类型的关键字,主要包括host,net,port。
例如 host 210.45.114.211,指定主机 210.45.114.211,net 210.11.0.0 指明210.11.0.0是⼀个⽹络地址,port 21 指明端⼝号是21。
如果没有指定类型,缺省的类型是host.2、关于传输⽅向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的⽅向。
tcpdump抓包分析详解

tcpdump抓包分析详解[root@linux ~]# tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae][-qX] [-r 档案] [所欲撷取的数据内容]参数:-nn:直接以IP 及port number 显示,而非主机名与服务名称-i :后面接要『监听』的网络接口,例如eth0, lo, ppp0 等等的界面;-w :如果你要将监听所得的封包数据储存下来,用这个参数就对了!后面接档名-c :监听的封包数,如果没有这个参数,tcpdump 会持续不断的监听,直到使用者输入[ctrl]-c 为止。
-A :封包的内容以ASCII 显示,通常用来捉取WWW 的网页封包资料。
-e :使用资料连接层(OSI 第二层) 的MAC 封包数据来显示;-q :仅列出较为简短的封包信息,每一行的内容比较精简-X :可以列出十六进制(hex) 以及ASCII 的封包内容,对于监听封包内容很有用-r :从后面接的档案将封包数据读出来。
那个『档案』是已经存在的档案,并且这个『档案』是由-w 所制作出来的。
所欲撷取的数据内容:我们可以专门针对某些通讯协议或者是IP 来源进行封包撷取,那就可以简化输出的结果,并取得最有用的信息。
常见的表示方法有:'host foo', 'host 127.0.0.1' :针对单部主机来进行封包撷取'net 192.168' :针对某个网域来进行封包的撷取;'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制'tcp port 21':还可以针对通讯协议侦测,如tcp, udp, arp, ether 等还可以利用and 与or 来进行封包数据的整合显示呢!范例一:以IP 与port number 捉下eth0 这个网络卡上的封包,持续 3 秒[root@linux ~]# tcpdump -i eth0 -nntcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 964801:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 9648<==按下[ctrl]-c 之后结束6680 packets captured <==捉下来的封包数量14250 packets received by filter <==由过滤所得的总封包数量7512 packets dropped by kernel <==被核心所丢弃的封包如果你是第一次看tcpdump 的man page 时,肯定一个头两个大,因为tcpdump 几乎都是分析封包的表头数据,用户如果没有简易的网络封包基础,要看懂粉难吶!所以,至少您得要回到网络基础里面去将TCP 封包的表头数据理解理解才好啊!^_^!至于那个范例一所产生的输出范例中,我们可以约略区分为数个字段,我们以范例一当中那个特殊字体行来说明一下:01:33:40.41:这个是此封包被撷取的时间,『时:分:秒』的单位;IP:透过的通讯协议是IP ;192.168.1.100.22 > :传送端是192.168.1.100 这个IP,而传送的port number 为22,您必须要了解的是,那个大于(>) 的符号指的是封包的传输方向喔!192.168.1.11.1190:接收端的IP 是192.168.1.11,且该主机开启port 1190 来接收;P 116:232(116):这个封包带有PUSH 的数据传输标志,且传输的数据为整体数据的116~232 byte,所以这个封包带有116 bytes 的数据量;ack 1 win 9648:ACK与Window size 的相关资料。
服务器抓包命令:tcpdump详解

服务器抓包命令:tcpdump详解简介:tcpdump,就是:dump the traffic on a network,根据使⽤者的定义对⽹络上的数据包进⾏截获的包分析⼯具。
⼀个No-GUI的抓包分析⼯具。
tcpdump,可以将⽹络中传送的数据包的“头”完全截获下来提供分析。
它⽀持针对⽹络层、协议、主机、⽹络或端⼝的过滤,并提供and、or、not等逻辑语句来帮助你去掉⽆⽤的信息。
Linux已经⾃动安装,可直接使⽤。
概要:tcpdump采⽤命令⾏⽅式,它的命令格式为:tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ][ -c count ] [ -C file_size ][ -E spi@ipaddr algo:secret,... ][ -F file ] [ -G rotate_seconds ] [ -i interface ][ --immediate-mode ] [ -j tstamp_type ] [ -m module ][ -M secret ] [ --number ] [ --print ] [ -Q in|out|inout ][ -r file ] [ -s snaplen ] [ -T type ] [ --version ][ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ][ -z postrotate-command ] [ -Z user ][ --time-stamp-precision=tstamp_precision ][ expression ]tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ][ -C file_size ] [ -F file ][ -i interface ] [ -m module ] [ -M secret ][ -r file ] [ -s snaplen ] [ -T type ] [ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,... ][ -y datalinktype ] [ -Z user ][ expression ]-A 以ASCII码⽅式显⽰每⼀个数据包(不会显⽰数据包中链路层头部信息). 在抓取包含⽹页数据的数据包时, 可⽅便查看数据(nt: 即Handy for capturing web pages).-b 使⽤ASDOT表⽰法在BGP数据包中打印AS号,⽽不是ASPLAIN表⽰法-B buffer_size--buffer-size=buffer_size将操作系统捕获缓冲区⼤⼩设置为buffer_size,单位为KiB(1024字节)-c counttcpdump将在接受到count个数据包后退出.-C file-size (nt: 此选项⽤于配合-w file 选项使⽤)该选项使得tcpdump 在把原始数据包直接保存到⽂件中之前, 检查此⽂件⼤⼩是否超过file-size. 如果超过了, 将关闭此⽂件,另创⼀个⽂件继续⽤于原始数据包的记录. 新创建的⽂件名与-w 选项指定的⽂件名⼀致, 但⽂件名后多了⼀个数字.该数字会-d 以容易阅读的形式,在标准输出上打印出编排过的包匹配码, 随后tcpdump停⽌.(nt | rt: human readable, 容易阅读的,通常是指以ascii码来打印⼀些信息. compiled, 编排过的. packet-matching code, 包匹配码,含义未知, 需补充)-dd 以C语⾔的形式打印出包匹配码.-ddd 以⼗进制数的形式打印出包匹配码(会在包匹配码之前有⼀个附加的'count'前缀).-D 打印系统中所有tcpdump可以在其上进⾏抓包的⽹络接⼝. 每⼀个接⼝会打印出数字编号, 相应的接⼝名字, 以及可能的⼀个⽹络接⼝描述. 其中⽹络接⼝名字和数字编号可以⽤在tcpdump 的-i flag 选项(nt: 把名字或数字代替flag), 来指定要在其上抓此选项在不⽀持接⼝列表命令的系统上很有⽤(nt: ⽐如, Windows 系统, 或缺乏 ifconfig -a 的UNIX系统); 接⼝的数字编号在windows 2000 或其后的系统中很有⽤, 因为这些系统上的接⼝名字⽐较复杂, ⽽不易使⽤.如果tcpdump编译时所依赖的libpcap库太⽼,-D 选项不会被⽀持, 因为其中缺乏 pcap_findalldevs()函数.-e 每⾏的打印输出中将包括数据包的数据链路层头部信息-E spi@ipaddr algo:secret,...可通过spi@ipaddr algo:secret 来解密IPsec ESP包(nt | rt:IPsec Encapsulating Security Payload,IPsec 封装安全负载, IPsec可理解为, ⼀整套对ip数据包的加密协议, ESP 为整个IP 数据包或其中上层协议部分被加密后的数据,前者的⼯作模式称为需要注意的是, 在终端启动tcpdump 时, 可以为IPv4 ESP packets 设置密钥(secret).可⽤于加密的算法包括des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc, 或者没有(none).默认的是des-cbc(nt: des, Data Encryption Standard, 数据加密标准, 加密算法未知, 另需补充).secret 为⽤于ESP 的密钥, 使⽤ASCII 字符串⽅式表达该选项中ESP 的定义遵循RFC2406, ⽽不是 RFC1827. 并且, 此选项只是⽤来调试的, 不推荐以真实密钥(secret)来使⽤该选项, 因为这样不安全: 在命令⾏中输⼊的secret 可以被其他⼈通过ps 等命令查看到.除了以上的语法格式(nt: 指spi@ipaddr algo:secret), 还可以在后⾯添加⼀个语法输⼊⽂件名字供tcpdump 使⽤(nt:即把spi@ipaddr algo:secret,... 中...换成⼀个语法⽂件名). 此⽂件在接受到第⼀个ESP 包时会打开此⽂件, 所以最好此时把赋予tcp -f 显⽰外部的IPv4 地址时(nt: foreign IPv4 addresses, 可理解为, ⾮本机ip地址), 采⽤数字⽅式⽽不是名字.(此选项是⽤来对付Sun公司的NIS服务器的缺陷(nt: NIS, ⽹络信息服务, tcpdump 显⽰外部地址的名字时会⽤到她提供的名称服务): 此NIS服务由于对外部(foreign)IPv4地址的测试需要⽤到本地⽹络接⼝(nt: tcpdump 抓包时⽤到的接⼝)及其IPv4 地址和⽹络掩码. 如果此地址或⽹络掩码不可⽤, 或者此接⼝根本就没有设置相应⽹络地址和⽹络掩码(nt: linux 下的 'any' ⽹络接⼝就不需要设置地-F file使⽤file ⽂件作为过滤条件表达式的输⼊, 此时命令⾏上的输⼊将被忽略.-i interface指定tcpdump 需要监听的接⼝. 如果没有指定, tcpdump 会从系统接⼝列表中搜寻编号最⼩的已配置好的接⼝(不包括 loopback 接⼝).⼀但找到第⼀个符合条件的接⼝, 搜寻马上结束.在采⽤2.2版本或之后版本内核的Linux 操作系统上, 'any' 这个虚拟⽹络接⼝可被⽤来接收所有⽹络接⼝上的数据包(nt: 这会包括⽬的是该⽹络接⼝的, 也包括⽬的不是该⽹络接⼝的). 需要注意的是如果真实⽹络接⼝不能⼯作在'混杂'模式(promiscuou 如果 -D 标志被指定, tcpdump会打印系统中的接⼝编号,⽽该编号就可⽤于此处的interface 参数.-l 对标准输出进⾏⾏缓冲(nt: 使标准输出设备遇到⼀个换⾏符就马上把这⾏的内容打印出来).在需要同时观察抓包打印以及保存抓包记录的时候很有⽤. ⽐如, 可通过以下命令组合来达到此⽬的:``tcpdump -l | tee dat'' 或者 ``tcpdump -l > dat & tail -f dat''.(nt: 前者使⽤tee来把tcpdump 的输出同时放到⽂件dat和标准输出中, ⽽后者通过重定向操作'>', 把tcpdump的输出放到dat ⽂件中, 同时通过tail把dat⽂件中的内容放到标准输出中) -L 列出指定⽹络接⼝所⽀持的数据链路层的类型后退出.(nt: 指定接⼝通过-i 来指定)-m module通过module 指定的file 装载SMI MIB 模块(nt: SMI,Structure of Management Information, 管理信息结构MIB, Management Information Base, 管理信息库. 可理解为, 这两者⽤于SNMP(Simple Network Management Protoco)协议数据包的抓取. 具此选项可多次使⽤, 从⽽为tcpdump 装载不同的MIB 模块.-M secret 如果TCP 数据包(TCP segments)有TCP-MD5选项(在RFC 2385有相关描述), 则为其摘要的验证指定⼀个公共的密钥secret.-n 不对地址(⽐如, 主机地址, 端⼝号)进⾏数字表⽰到名字表⽰的转换.-N 不打印出host 的域名部分. ⽐如, 如果设置了此选现, tcpdump 将会打印'nic' ⽽不是 ''.-O 不启⽤进⾏包匹配时所⽤的优化代码. 当怀疑某些bug是由优化代码引起的, 此选项将很有⽤.-p ⼀般情况下, 把⽹络接⼝设置为⾮'混杂'模式. 但必须注意 , 在特殊情况下此⽹络接⼝还是会以'混杂'模式来⼯作;从⽽, '-p' 的设与不设, 不能当做以下选现的代名词:'ether host {local-hw-add}' 或 'ether broadcast'(nt: 前者表⽰只匹配以太⽹地址为ho -q 快速(也许⽤'安静'更好?)打印输出. 即打印很少的协议相关信息, 从⽽输出⾏都⽐较简短.-R 设定tcpdump 对 ESP/AH 数据包的解析按照 RFC1825⽽不是RFC1829(nt: AH, 认证头, ESP,安全负载封装, 这两者会⽤在IP包的安全传输机制中). 如果此选项被设置, tcpdump 将不会打印出'禁⽌中继'域(nt: relay prevention field). 另外,由于ES-r file从⽂件file 中读取包数据. 如果file 字段为 '-' 符号, 则tcpdump 会从标准输⼊中读取包数据.-S 打印TCP 数据包的顺序号时, 使⽤绝对的顺序号, ⽽不是相对的顺序号.(nt: 相对顺序号可理解为, 相对第⼀个TCP 包顺序号的差距,⽐如, 接受⽅收到第⼀个数据包的绝对顺序号为232323, 对于后来接收到的第2个,第3个数据包, tcpdump会打印其序-s snaplen设置tcpdump的数据包抓取长度为snaplen, 如果不设置默认将会是68字节(⽽⽀持⽹络接⼝分接头(nt: NIT, 上⽂已有描述,可搜索'⽹络接⼝分接头'关键字找到那⾥)的SunOS系列操作系统中默认的也是最⼩值是96).68字节对于IP, ICMP(nt: Internet C -T type强制tcpdump按type指定的协议所描述的包结构来分析收到的数据包. ⽬前已知的type 可取的协议为:aodv (Ad-hoc On-demand Distance Vector protocol, 按需距离向量路由协议, 在Ad hoc(点对点模式)⽹络中使⽤),cnfp (Cisco NetFlow protocol), rpc(Remote Procedure Call), rtp (Real-Time Applications protocol),rtcp (Real-Time Applications con-trol protocol), snmp (Simple Network Management Protocol),tftp (Trivial File Transfer Protocol, 碎⽂件协议), vat (Visual Audio Tool, 可⽤于在internet 上进⾏电视电话会议的应⽤层协议), 以及wb (distributed White Board, 可⽤于⽹络会议的应⽤层协议).-t 在每⾏输出中不打印时间戳-tt 不对每⾏输出的时间进⾏格式处理(nt: 这种格式⼀眼可能看不出其含义, 如时间戳打印成1261798315)-ttt tcpdump 输出时, 每两⾏打印之间会延迟⼀个段时间(以毫秒为单位)-tttt 在每⾏打印的时间戳之前添加⽇期的打印-u 打印出未加密的NFS 句柄(nt: handle可理解为NFS 中使⽤的⽂件句柄, 这将包括⽂件夹和⽂件夹中的⽂件)-U 使得当tcpdump在使⽤-w 选项时, 其⽂件写⼊与包的保存同步.(nt: 即, 当每个数据包被保存时, 它将及时被写⼊⽂件中,⽽不是等⽂件的输出缓冲已满时才真正写⼊此⽂件)-U 标志在⽼版本的libcap库(nt: tcpdump 所依赖的报⽂捕获库)上不起作⽤, 因为其中缺乏pcap_cump_flush()函数.-v 当分析和打印的时候, 产⽣详细的输出. ⽐如, 包的⽣存时间, 标识, 总长度以及IP包的⼀些选项. 这也会打开⼀些附加的包完整性检测, ⽐如对IP或ICMP包头部的校验和.-vv 产⽣⽐-v更详细的输出. ⽐如, NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码.-vvv 产⽣⽐-vv更详细的输出. ⽐如, telent 时所使⽤的SB, SE 选项将会被打印, 如果telnet同时使⽤的是图形界⾯,其相应的图形选项将会以16进制的⽅式打印出来(nt: telnet 的SB,SE选项含义未知, 另需补充).-w 把包数据直接写⼊⽂件⽽不进⾏分析和打印输出. 这些包数据可在随后通过-r 选项来重新读⼊并进⾏分析和打印.-W filecount此选项与-C 选项配合使⽤, 这将限制可打开的⽂件数⽬, 并且当⽂件数据超过这⾥设置的限制时, 依次循环替代之前的⽂件, 这相当于⼀个拥有filecount 个⽂件的⽂件缓冲池. 同时, 该选项会使得每个⽂件名的开头会出现⾜够多并⽤来占位的0, 这可-x 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据(但不包括连接层的头部).总共打印的数据⼤⼩不会超过整个数据包的⼤⼩与snaplen 中的最⼩值. 必须要注意的是, 如果⾼层协议数据没有snaplen 这么长,并-xx tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据, 其中包括数据链路层的头部.-X 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据(但不包括连接层的头部).这对于分析⼀些新协议的数据包很⽅便.-XX 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据, 其中包括数据链路层的头部.这对于分析⼀些新协议的数据包很⽅便.-y datalinktype设置tcpdump 只捕获数据链路层协议类型是datalinktype的数据包-Z user使tcpdump 放弃⾃⼰的超级权限(如果以root⽤户启动tcpdump, tcpdump将会有超级⽤户权限), 并把当前tcpdump的⽤户ID设置为user, 组ID设置为user⾸要所属组的ID(nt: tcpdump 此处可理解为tcpdump 运⾏之后对应的进程)此选项也可在编译的时候被设置为默认打开.(nt: 此时user 的取值未知, 需补充)命令实例:⼀、默认启动tcpdump:直接启动tcpdump将监视第⼀个⽹络接⼝上所有流过的数据包。
Android设备上非root的抓包实现方法(Tcpdump方法)

Android设备上⾮root的抓包实现⽅法(Tcpdump⽅法)通常我们在Android应⽤中执⾏某个命令时会使⽤“Runtime.getRuntime().exec("命令路径")”这种⽅式,但是当我们执⾏抓包操作时,使⽤这条命令⽆论如何都不⾏,通过下⾯代码打印结果发现,该命令⼀定要在root权限下才能执⾏。
BufferedReader brW = new BufferedReader(new InputStreamReader(p.getErrorStream()));while((str = brW.readLine()) != null)Log.d("cwmp", "w:"+str);但是我们的Android设备(包括机顶盒、⼿机等)通常并没有root过,apk的最⾼权限也只是system权限,这该怎么解决?⾸先我们要知道,⽅法总⽐问题多,在Android设备的/system/bin路径下,我们会看到很多⼆进制⽂件,这些⼆进制⽂件可以获得root权限。
因此,我们可以通过C语⾔来实现抓包功能,通过NDK把该C代码交叉编译成⼆进制⽂件置于/system/bin路径下,并赋予其root权限,此时,这个⼆进制⽂件就具备了抓包能⼒了。
现在问题⼜来了,我们现在是想通过apk去调⽤这个抓包指定,抓包完成后⼜该怎么通知apk呢?其实,Android可以通过socket使底层与framework层进⾏通信,具体请参考。
接下来我们将贴出关键实现代码。
1、编写socket服务端代码fstiService.cpp,⽣成可执⾏脚本fstiService#define SOCKET_NAME "fstiService"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "itv_assistance", __VA_ARGS__)#include <jni.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#include <sys/un.h>#include <cutils/sockets.h>#include <android/log.h>#include <unistd.h>#include <time.h>#include <sys/time.h>#include <pthread.h>pthread_t thread[2];char s_time[10]; //抓包时间⼦串char s_command[256]; //抓包指令⼦串//抓包指令:system("/system/bin/tcpdump -v -w /sdcard/te.pcap");//获取进程tcpdump的进程号int getPid() {//for Linux C//FILE *fp = popen("ps -e | grep \'tcpdump\' | awk \'{print $1}\'", "r");//for Android(ARM)//FILE *fp = popen("ps | grep \'tcpdump\'", "r");FILE *fp = popen("ps | grep \'tcpdump\'", "r");char buff[1024] = { 0 };while (NULL != fgets(buff, sizeof(buff), fp));//取消换⾏符(10)buff[strlen(buff) - 1] = '\0';pclose(fp);char dst[5] = { 0 };char *p = buff;char *q = dst;//每⼀⾏进程信息的第⼆个字符串为进程号while (*p != ' ')p++;while (*p == ' ')p++;while (*p != ' ')*(q++) = *(p++);*(q++) = '\0';return atoi(dst);}//截取⼦串(抓包时间(秒):抓包命令)void substring(char *time, char *command, char *src) {char *p = src;char *q = time;char *s = command;while (*p != '/')*(q++) = *(p++);*(q++) = '\0';//如果Tcpdump命令已添加环境变量,则添加下⾏代码//否则删除下⼀⾏代码,client传递的参数格式必须为: num/tcpdump所在路径p++;while (*p)*(s++) = *(p++);*(s++) = '\0';}//抓包线程void *thread1(void *arg) {system(s_command);}void *thread2(void *arg) {int i_time = atoi(s_time);int begin = time((time_t*) NULL);while (1) {if (time((time_t*) NULL) - begin < i_time) {//printf("当前时间(s):%ld\n", time((time_t*)NULL));continue;} else {int n = kill(getPid(), SIGKILL);LOGD("the kill process result is n=%d", n);break;}}return 0;}//创建⼦线程void thread_create() {int temp;memset(&thread, 0, sizeof(thread));if ((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0)LOGD("create tcpdump thread failure");elseLOGD("create tcpdump thread success");if ((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0)LOGD("create count thread failure");elseLOGD("create count thread success");}void thread_wait() {if (thread[0] != 0) {pthread_join(thread[0], NULL);LOGD("tcpdump thread has terminated");}if (thread[1] != 0) {//pthread_join(thread[1], NULL);printf("counter thread has terminated");}}/*** Native层Socket服务端*/int main() {int connect_number = 6;int fdListen = -1, new_fd = -1;int ret;struct sockaddr_un peeraddr;socklen_t socklen = sizeof(peeraddr);int numbytes;char buff[256];//这⼀步很关键,就是获取init.rc中配置的名为 "fstiService" 的socket//获取已绑定的socket,返回-1为错误情况fdListen = android_get_control_socket(SOCKET_NAME);if (fdListen < 0) {LOGD("failed to get socket '" SOCKET_NAME "' errno %d", errno);exit(-1);}/*** ⽅法说明:开始监听(等待参数fdListen的socket连接,参数connect_number指定同时能处理的最⼤连接要求)* 如果连接数⽬达此上限则client端将收到ECONNREFUSED的错误。
tcpdump抓包命令使用教程

tcpdump抓包命令使⽤教程⽬录tcpdump 是Linux系统下的⼀个强⼤的命令,可以将⽹络中传送的数据包完全截获下来提供分析。
它⽀持针对⽹络层、协议、主机、⽹络或端⼝的过滤,并提供and、or、not等逻辑语句来帮助你去掉⽆⽤的信息。
⼀、tcpdump 命令格式介绍⾸先我们对Linux系统下tcpdump命令格式进⾏⼀个介绍说明,在下⾯的使⽤教程中讲到tcpdump命令⽰例时,您就可以参考tcpdump命令参数说明进⾏学习。
1.1 语法tcpdump [ -AdDefIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ][ -C file_size ] [ -G rotate_seconds ] [ -F file ][ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ][ -Q|-P in|out|inout ][ -r file ] [ -s snaplen ] [ -T type ] [ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,... ][ -y datalinktype ] [ -z postrotate-command ] [ -Z user ][ expression ]1.2 命令⾏参数介绍-A 以ASCII格式打印出所有分组,并将链路层的头最⼩化。
-c 在收到指定的数量的分组后,tcpdump就会停⽌。
-C 在将⼀个原始分组写⼊⽂件之前,检查⽂件当前的⼤⼩是否超过了参数file_size中指定的⼤⼩。
如果超过了指定⼤⼩,则关闭当前⽂件,然后在打开⼀个新的⽂件。
参数 file_size的单位是兆字节(是1,000,000字节,⽽不是1,048,576字节)。
-d 将匹配信息包的代码以⼈们能够理解的汇编格式给出。
TCPdump指定时间或者指定大小进行循环抓取报文

TCPdump指定时间或者指定大小进行循环抓取报文
背景:我们用tcpdump工具循环抓取网卡上的报文,我们会遇到如下情况:
1. 抓取报文后隔指定的时间保存一次;
2. 抓取报文后达到指定的大小保存一次;
本文就这两种情况给出tcpdump的使用方法
1. 抓取报文后隔指定的时间保存一次:
tcpdump -i eth3 -s0 -G 60 -Z root -w %Y_%m%d_%H%M_% S.pcap
这里解释下-G选项后面接时间单位为秒本例中的时间为60秒
2. 抓取报文后达到指定的大小保存一次;
tcpdump -i eth3 -s0 -C 1 -Z root -w jiangsuyinhang.pcap
-i 指定网卡名称
这里的-s0 表示每个报文的大小是接收到的指定大小,如果没有这个选项,则超过比如1500字节的报文,就会被切除1500字节以外的部分
-C(小写)表示每当文件达到指定大小时进行重新保存一个新文件,单位是MB
-Z(小写) 表示下面的新文件也是用root权限来执行的,如果用-c 时必须配合-Z(大写z).
-w(小写) 后面跟具体的文件名称
注意:这个命令行保存下来的文件名是jiangsuyinhang.pcap jia ngsuyinhang.pcap0 jiangsuyinhang.pcap1……jiangsuyinhang.pc apN。
抓包命令tcpdump

Tcpdump命令格式System>tcpdump -i any port 23 –n先用这个来确定本地地址,再来抓包tcpdump -i eth0 port 22 and src host 192.168.1.100 –ntcpdump -i eth0 port 22 and dst host 192.168.1.100 –n-i -----interfaceR是接收X是转发根据目的地址抓包TopsecOS# system tcpdump -i any host 172.16.1.20 -ntcpdump: WARNING: Promiscuous mode not supported on the "any" devicetcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on any, link-type LINUX_SLL (Linux cooked), capture size 68 bytes02:13:31.934485 R@eth0 IP 172.16.1.20.8002 > 198.100.100.200.1241: F 2607699394: 2607699394(0) ack 908633180 win 6512302:13:31.934501 X@eth1 IP 172.16.1.20.8002 > 47.17.225.30.1241: F 2607699394:260 7699394(0) ack 908633180 win 6512302:13:31.934644 R@eth0 IP 172.16.1.20.8002 > 198.100.100.200.1243: F 683368251:6 83368251(0) ack 2932894753 win 6512302:13:31.934652 X@eth1 IP 172.16.1.20.8002 > 47.17.225.30.1243: F 683368251:683368251(0) ack 2932894753 win 6512302:13:31.934850 R@eth0 IP 172.16.1.20.8002 > 198.100.100.200.1242: F 3204228935: 3204228935(0) ack 378320269 win 6512302:13:31.934863 X@eth1 IP 172.16.1.20.8002 > 47.17.225.30.1242: F 3204228935:320 4228935(0) ack 378320269 win 6512302:13:31.935053 R@eth0 IP 172.16.1.20.8002 > 198.100.100.200.1239: F 302027424:3 02027424(0) ack 737677523 win 6510002:13:31.935060 X@eth1 IP 172.16.1.20.8002 > 47.17.225.30.1239: F 302027424:302027424(0) ack 737677523 win 65100首先,在“系统”→“开放服务”中,添加需要telnet区域的相应的telnet权限,“开始”→“运行”→“cmd”,输入telnet 10.0.0.1。
tcpdump抓包高级用法

tcpdump抓包高级用法【表达式】tcpdump –i ethx ether[xx:yy]=0xabcde… -nn【说明】普通的tcpdump抓包后面直接跟主机,端口或协议等过滤条件,而这种抓包方法在某些环境下是无法使用的,如有QinQ,lwapp,wltp,pppoe等协议封装时,要抓电脑真实IP的数据包便实现不了。
高级抓包方法可以满足,特别是在wlan环境下,经过我们设备的数据流都是经过隧道封装的,所以只能用高级抓包方法。
高级抓包方法中的过滤条件为ether[xx:yy]=0xabcd….,表示从以太网帧头部开始偏移xx字节后的yy个字节的值是十六进制abcd….。
如tcpdump –i eth0 ether[92:4]=0xab0d4f9c –nn,表示在eth0抓取符合下面条件的数据包,从以太网帧第92字节开始,后面4个字节的值为十六进制ab0d4f9c的所有数据包。
这种抓包方法要求我们事先算好过滤条件对应的十六进制及其偏移值。
下面举个例子说明。
【案例】如附件中的数据包,是wlan环境下隧道封装的数据包,用抓包软件打开只能看到隧道头地址,无法看到隧道内真实的IP地址。
隧道内真实的IP所在的段为111.14.0.0/16,现要抓取111.14.236.138这个地址的数据包。
1.将111.14.236.138这个IP地址转换为十六进制为0x6f0eec8a2.在eth0将所有的数据包抓100个下来(tcpdump –i eth0 –s0 –c 100 –w /tmp/test.pcap),如附件,用wireshark打开,找到隧道内真实IP地址,再算出真实IP地址偏移以太网头的字节数(这里应该会有问到怎样找到隧道内真实的IP头,请参考文章自定义协议剥离配置说明)。
3.这里已经算出来,111.14.0.0/16段的上行数据偏移以太网头92字节,下行数据偏移以太网头96字节,所以抓取111.14.236.138这个地址的所有数据包,tcpdump表达式应该如下:tcpdump –i eth0 ether[92:4]=0x6f0eec8a or ether[96:4]=0x6f0eec8a –nn抓包结果如下图:。
安卓手机利用adb和tcpdump手机抓包

安卓手机利用adb和tcpdump手机抓包准备:1. 手机要有root权限2. 下载tcpdump步骤:1. adb push tcpdump /data/local/tcpdump2. adb shell chmod 6755 /data/local/tcpdump3. adb shell, su获得root权限4. cd /data/local5. /tcpdump -i any -p -s 0 -w /data/capture.pcap命令参数:# "-i any": listen on any network interface# "-p": disable promiscuous mode (doesn't work anyway)# "-s 0": capture the entire packet# "-w": write packets to a file (rather than printing to stdout) ... do whatever you want to capture, then ^C to stop it ...6, adb pull /data/capture.pcap d:/7, 在电脑上用wireshark打开capture.pcap即可分析logExecute the following if you would like to watch packets go by rather than capturing them to a file (-n skips DNS lookups. -s 0 captures the entire packet rather than just the header):adb shell tcpdump -n -s 0Typical tcpdump options apply. For example, if you want to see HTTP traffic:只监听httpadb shell tcpdump -X -n -s 0 port 80根据以上的信息,写一个bat去执行(tcpdump文件必须在当前目录里)。
使用tcpdump命令在Linux中抓取指定端口的网络数据包

使用tcpdump命令在Linux中抓取指定端口的网络数据包在Linux中使用tcpdump命令抓取指定端口的网络数据包在网络通信中,数据包的抓取和分析是非常重要的,它能帮助我们了解网络流量、问题排查、安全性分析等方面的情况。
在Linux系统中,我们可以使用tcpdump命令来实现抓取指定端口的网络数据包。
本文将介绍如何使用tcpdump命令在Linux系统中抓取指定端口的网络数据包。
一、什么是tcpdump命令tcpdump是一个在Unix和Linux系统下的用于抓取网络数据包的命令行工具。
它能够监听网络接口上的网络流量,并将数据包内容以及相关的信息进行输出。
tcpdump命令可以根据用户的需求,对网络数据包进行过滤、解析和保存。
二、安装tcpdump在开始使用tcpdump之前,我们需要先确保系统已经安装了该命令。
可以通过以下命令来检查是否已经安装了tcpdump:```$ tcpdump -h```如果系统没有安装tcpdump,可以使用以下命令来安装:```$ sudo apt-get install tcpdump```三、tcpdump命令的基本用法tcpdump命令的基本语法如下:```$ tcpdump [选项] [表达式]```其中,选项用于指定tcpdump命令的具体行为,而表达式用于过滤所抓取的网络数据包。
下面介绍一些常用的选项和表达式:1. 选项- -i:指定网络接口,如eth0、wlan0等。
- -c:指定抓取数据包的数量。
- -v:输出详细的数据包信息。
- -X:以16进制和ASCII格式显示数据包内容。
2. 表达式- host:按照主机进行过滤,如host 192.168.0.1。
- port:按照端口进行过滤,如port 80。
- src/dst:按照源地址或目的地址进行过滤,如src 192.168.0.1或dst 192.168.0.2。
- and/or/not:用于进行逻辑运算,如host 192.168.0.1 and port 80。
tcpdump抓包命令实例

下面的例子全是以抓取eth0接口为例,如果不加”-i eth0”是表示抓取所有的接口包括lo。
1、抓取包含10.10.10.122的数据包# tcpdump -i eth0 -vnn host 10.10.10.1222、抓取包含10.10.10.0/24网段的数据包# tcpdump -i eth0 -vnn net 10.10.10.0/243、抓取包含端口22的数据包# tcpdump -i eth0 -vnn port 224、抓取udp协议的数据包# tcpdump -i eth0 -vnn udp5、抓取icmp协议的数据包# tcpdump -i eth0 -vnn icmp6、抓取arp协议的数据包# tcpdump -i eth0 -vnn arp7、抓取ip协议的数据包# tcpdump -i eth0 -vnn ip8、抓取源ip是10.10.10.122数据包。
# tcpdump -i eth0 -vnn src host 10.10.10.1229、抓取目的ip是10.10.10.122数据包# tcpdump -i eth0 -vnn dst host 10.10.10.12210、抓取源端口是22的数据包# tcpdump -i eth0 -vnn src port 2211、抓取源ip是10.10.10.253且目的ip是22的数据包# tcpdump -i eth0 -vnn src host 10.10.10.253 and dst port 2212、抓取源ip是10.10.10.122或者包含端口是22的数据包# tcpdump -i eth0 -vnn src host 10.10.10.122 or port 2213、抓取源ip是10.10.10.122且端口不是22的数据包[root@ ftp]# tcpdump -i eth0 -vnn src host 10.10.10.122 and not port 2214、抓取源ip是10.10.10.2且目的端口是22,或源ip是10.10.10.65且目的端口是80的数据包。