tcp协议抓包只能用(tcp协议抓包实践)

      最后更新:2023-06-12 09:36

      ubuntu14.04 用tcpdump进行网络抓包,地点学校的校园网,可是只能监听到本机的包,其他电脑的包监听不到

      因为你的网卡只能看自己的traffic阿,你怎麽可能用自己网卡去看其他人的traffic呢?你真的想太多了。人家的data traffic都没通过你的网卡,当然抓不到阿。除非你用hub让人家的电脑从你的hub上走,或是你可以access你们学校的router或switch,不然就是这个结果。
      使用tcpdump是完全可以监听同一个局域网上的其他工作站的网络数据包的。以太网的数据链路层是多点接入的,任何一个以太网上的主机发出的数据帧所有的主机都能收到。默认情况下,如果帧首部的目的地址不是本机的mac地址或者不是广播地址,网卡收到就将之丢弃。但是如果网卡处于混杂模式的话,即使不是发往自己的帧也收下。tcpdump默认将网卡设置为混杂模式,但是这是受底层操作系统限制的,有的网卡也不能设置为混杂模式,这个不能怪tcpdump。。。。。
      ubuntu14.04 用tcpdump进行网络抓包,地点学校的校园网,可是只能监听到本机的包,其他电脑的包监听不到

      tcp/ip协议只能用于internet,不能用于局域网

      怎么可能,你在家用路由器 WIFI 上网这个就用了 tcp/ip协议。
      tcp/ip协议只能用于internet,不能用于局域网

      tcpdump 命令使用简介

      tcpdump 是一款强大的网络抓包工具,运行在 linux 平台上。熟悉 tcpdump 的使用能够帮助你分析、调试网络数据。要想使用很好地掌握 tcpdump, 必须对网络报文( TCP/IP协议)有一定的了解。不过对于简单的使用来说,只要有网络基础概念就行了。tcpdump 是一个很复杂的命令,想了解它的方方面面非常不易,也不值得推荐,能够使用它解决日常工作中的问题才是关键。tcpdump 的选项也很多,要想知道所有选项的话,请参考man tcpdump ,下面只记录 tcpdump 最常用的选项。完整的英文文档: https://www.tcpdump.org/tcpdump_man.html需要注意的是,tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用-s number ,number就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。Frame = Ethernet Header + IP Header + TCP Header + TCP Segment DataEthernet Header 以下的IP数据报最大传输单位为 MTU (Maximum Transmission Unit,Effect of short board),对于大多数使用以太网的局域网来说, MTU=1500 。TCP数据包每次能够传输的最大数据分段为MSS,为了达到最佳的传输效能,在建立TCP连接时双方将协商MSS值——双方提供的MSS值中的最小值为这次连接的最大MSS值。MSS往往基于MTU计算出来,通常MSS=MTU-sizeof(IP Header)-sizeof(TCP Header)=1500-20-20=1460。这样,数据经过本地TCP层分段后,交给本地IP层,在本地IP层就不需要分片了。但是在下一跳路由(Next Hop)的邻居路由器上可能发生IP分片!因为路由器的网卡的MTU可能小于需要转发的IP数据报的大小。这时候,在路由器上可能发生两种情况:(1)如果源发送端设置了这个IP数据包可以分片(May Fragment,DF=0),路由器将IP数据报分片后转发。(2)如果源发送端设置了这个IP数据报不可以分片(Don’t Fragment,DF=1),路由器将IP数据报丢弃,并发送ICMP分片错误消息给源发送端。默认启动,普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包监听所有端口,直接显示 ip 地址。显示更详细的数据报文,包括 tos, ttl, checksum 等。显示数据报的全部数据信息,用 hex 和 ascii 两列对比输出。下面是抓取 ping 命令的请求和返回的两个报文,可以看到全部的数据。机器上的网络报文数量异常的多,很多时候我们只关系和具体问题有关的数据报(比如访问某个网站的数据,或者 icmp 超时的报文等等),而这些数据只占到很小的一部分。把所有的数据截取下来,从里面找到想要的信息无疑是一件很费时费力的工作。而 tcpdump 提供了灵活的语法可以精确地截取关心的数据报,简化分析的工作量。这些选择数据包的语句就是过滤器(filter)!过滤器也可以简单地分为三类: type ,dir和proto 。Type让你区分报文的类型,主要由host (主机),net (网络) 和port (端口) 组成。 src和dst也可以用来过滤报文的源地址和目的地址。此外还有指定端口和数据报文范围的过滤器:过于过滤器的更多详细信息,请访问 tcpdump 官方 map page 的PCAP-FILTER 部分使用 tcpdump 截取数据报文的时候,默认会打印到屏幕的默认输出,你会看到按照顺序和格式,很多的数据一行行快速闪过,根本来不及看清楚所有的内容。不过,tcpdump 提供了把截取的数据保存到文件的功能,以便后面使用其他图形工具(比如 wireshark,Snort)来分析。-w选项用来把数据报文输出到文件,比如下面的命令就是把所有 80 端口的数据导入到文件-r可以读取文件里的数据报文,显示到屏幕上。NOTE:保存到文件的数据不是屏幕上看到的文件信息,而是包含了额外信息的固定格式 pcap,需要特殊的软件(如: Wireshark )来查看,使用 vim 或者 cat 命令会出现乱码。过滤的真正强大之处在于你可以随意组合它们,而连接它们的逻辑就是常用的与/AND/&& 、或/OR/||和非/not/! 。从上面的例子就可以看出,你可以随意地组合之前的过滤器来截取自己期望的数据报,最重要的就是知道自己要精确匹配的数据室怎样的!对于比较复杂的过滤器表达式,为了逻辑的清晰,可以使用括号。不过默认情况下,tcpdump 把()当做特殊的字符,所以必须使用单引号'来消除歧义:抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据截取数据只是第一步,第二步就是理解这些数据,下面就解释一下 tcpdump 命令输出各部分的意义。最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是192.168.1.106 ,源端口是56166 ,目的地址是124.192.132.54 ,目的端口是80 。>符号代表数据的方向。此外,上面的三条数据还是 tcp 协议的三次握手过程,第一条就是SYN报文,这个可以通过Flags [S]看出。下面是常见的 TCP 报文的 Flags:而第二条数据的[S.]表示SYN-ACK ,就是SYN报文的应答报文。如果是为了查看数据内容,建议用 tcpdump -s 0 -w filename 把数据包都保存下来,然后用wireshark的Follow TCP Stream/Follow UDP Stream来查看整个会话的内容。 -s 0 是抓取完整数据包,否则默认只抓68字节。用tcpflow也可以方便的获取TCP会话内容,支持tcpdump的各种表达式。-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工CTRL+C还是抓的太多,甚至导致服务器宕机,于是可以用 -c 参数指定抓多少个包。上面的命令计算抓10000个SYN包花费多少时间,可以判断访问量大概是多少。Wireshark(以前是ethereal)是Windows下非常简单易用的抓包工具。但在Linux下很难找到一个好用的图形化抓包工具。还好有Tcpdump。我们可以用Tcpdump + Wireshark 的完美组合实现:在 Linux 里抓包,然后在Windows 里分析包。0x4745为"GET"前两个字母"GE"0x4854为"HTTP"前两个字母"HT"tcpdump 对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序(如 Wireshark )进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。基本上tcpdump总的的输出格式为:系统时间 来源主机.端口 > 目标主机.端口 数据包参数
      tcpdump 命令使用简介

      详解 TCP(上)

      让我们来看看这张图首先来了解每个部分的意义其他部分解释在这里:为什么建链接要 3 次握手,断链接需要 4 次挥手?另有一些需要注意的地方:Again,使用tcp_tw_reuse和tcp_tw_recycle来解决TIME_WAIT的问题是非常非常危险的,因为这两个参数违反了TCP协议(RFC 1122)SeqNum 的增加是和传输的字节数相关的。上图中,三次握手后,来了两个 Len:1440 的包,而第二个包的 SeqNum 就成了 1441。然后第一个 ACK 回的是 1441,表示第一个 1440 收到了。注意:如果你用 Wireshark 抓包程序看 3 次握手,你会发现 SeqNum 总是为 0,不是这样的,Wireshark 为了显示更友好,使用了 Relative SeqNum ——相对序号,你只要在右键菜单中的 protocol preference 中取消掉就可以看到“Absolute SeqNum”了TCP 要保证所有的数据包都可以到达,所以,必需要有重传机制。比如:发送端发了 1,2,3,4,5 五个包,接收端收到了 1,2 于是返回 ack 3,然后收到了 4(3 没收到)。此时的 TCP 会怎么办?因为正如前面所说的,SeqNum 和 Ack 是以字节数为单位,所以 ack 的时候,不能跳着确认,只能确认最大的连续收到的包,不然,发送端就以为之前的都收到了。有这样一个简单的办法:不回 ack,死等 3。当发送方发现收不到 3 的 ack 超时后,会重传 3。一旦接收方收到 3 后,会 ack 回 4——意味着 3 和 4 都收到了。但是这样有个非常大的 BUG,不回 ACK 那收到的 4,5 也不告诉发送方,这样发送方很有可能会认为 4,5 也没有到。导致 4,5 的重传于是,TCP引入了一种叫Fast Retransmit的算法,不以时间驱动,而以数据驱动重传。也就是说,如果,包没有连续到达,就 ack 最后那个可能被丢了的包,如果发送方连续收到 3 次相同的ack,就重传。Fast Retransmit 的好处是不用等 timeout 了再重传。比如说:我收到了 3 没收到 2,返回 ack2我又收到了 4 但还是没收到 2,返回 ack2但是 TMD 我又收到了 5 就是没收到 2,还是返回 ack2这个时候,不用等 timeout 的发送方就知道了 2 怕是掉了。于是会重新发 2。然后我接收到了我就返回 ack6**快速重传只解决了一个问题:不再需要等 timeout 就可以重新传包了。那重传多少呢?我知道 4 丢了,那要不要重传 5,6,7 呢? **所以就有了另一个更好的办法:Selective Acknowledgment (SACK)。这种方式需要在 TCP 头里加一个 SACK 的东西,ACK 还是 Fast Retransmit 的 ACK,SACK 则是汇报收到的数据碎版。参看下图:这样,在发送端就可以根据回传的 SACK 知道哪些数据到了,哪些数据没有到。于是就优化了 Fast Retransmit 的算法。当然,这个协议需要两边都支持。在 Linux下,可以通过tcp_sack参数打开这个功能(Linux 2.4后默认打开)。这里还需要注意一个问题——接收方 Reneging,所谓 Reneging 的意思就是接收方有权把已经报给发送端 SACK 里的数据给丢了。这样干是不被鼓励的,因为这个事会把问题复杂化了,但是,接收方这么做可能会有些极端情况,比如要把内存给别的更重要的东西。所以,发送方也不能完全依赖 SACK,还是要依赖 ACK,并维护 Time-Out,如果后续的 ACK 没有增长,那么还是要把 SACK 的东西重传,另外,接收端这边永远不能把 SACK 的包标记为 Ack。注意:SACK 会消费发送方的资源,试想,如果一个攻击者给数据发送方发一堆 SACK 的选项,这会导致发送方开始要重传甚至遍历已经发出的数据,这会消耗很多发送端的资源。详细的东西请参看《 TCP SACK的性能权衡 》Duplicate SACK 又称 D-SACK,其主要使用了 SACK 来告诉发送方有哪些数据被重复接收了。D-SACK 使用了 SACK 的第一个段来做标志下面的示例中,丢了两个 ACK,所以,发送端重传了第一个数据包(3000-3499),于是接收端发现重复收到,于是回了一个SACK=3000-3500,因为 ACK 都到了 4000 意味着收到了 4000 之前的所有数据,所以这个 SACK 就是 D-SACK——旨在告诉发送端我收到了重复的数据,而且我们的发送端还知道,数据包没有丢,丢的是 ACK 包。下面的示例中,网络包(1000-1499)被网络给延误了,导致发送方没有收到 ACK,而后面到达的三个包触发了“Fast Retransmit算法”,所以重传,但重传时,被延误的包又到了,所以,回了一个SACK=1000-1500,因为 ACK 已到了3000,所以,这个 SACK 是D-SACK——标识收到了重复的包。这个案例下,发送端知道之前因为“Fast Retransmit算法”触发的重传不是因为发出去的包丢了,也不是因为回应的 ACK 包丢了,而是因为网络延时了。可见,引入了D-SACK,有这么几个好处:知道这些东西可以很好得帮助TCP了解网络情况,从而可以更好的做网络上的流控。Linux 下的 tcp_dsack 参数用于开启这个功能(Linux 2.4后默认打开)陈皓大神讲的真的非常非常好,我仔仔细细把这篇文章过了一遍。
      详解 TCP(上)

      Fiddler怎么抓取tcp/udp包,如图,我这个只能抓取http包.

      Fiddler官网的介绍: FiddlerCore is the core proxy engine used by Fiddler to intercept and modify web traffic. You can integrate FiddlerCore into your .NET applications to provide unprecedented functionality.Fiddler应该只是抓取web数据包的工具,应该不能抓tcp/udp等传输层的包。我的理解,Fiddler不太熟悉。 想抓取tcp/udp的包,推荐使用wireshark或者tcpdump。
      Fiddler怎么抓取tcp/udp包,如图,我这个只能抓取http包.

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类