zoukankan      html  css  js  c++  java
  • linux下抓包学习--tcpdump的使用

    一、为什么需要学这个

    很多时候,开发环境上不会出现问题。但在测试或者现场时,总是会有很多莫名其妙的问题。

    这时候,能在出问题的环境上,开启抓包,然后再去重现问题的话,这时候,就可以拿到第一手的资料了。

    这对我们解决问题,是至关重要的。

    以前在华为工作时,遇到一次问题,是电信客户投诉,一个第三方公司和我司都是电信的客户。第三方公司和我方通信的是一个

    boss系统,通信是soap协议。

    问题大概是boss系统对我方进行了请求,然后我方设备的应答不对。

    当时还是新员工的我,心慌得一匹,傻傻地找自己系统的问题,日志看过来看过去都没问题。后来,找到一线的技术支持,

    坚持要抓包才能方便分析问题后,技术支持给我抓了包。

    结果一看,对方boss系统的参数有问题,我方是按照协议开发的。我方没问题。

    然后就变成了第三方公司去向电信解释,当初为啥没按照协议开发,各种追责。。。

    所以,抓包的重要性毋庸置疑。它既能协助我们快速定位一个bug,也能在问题发生时,将不是自己的锅甩出去。

    下面就看看简单的tcpdump抓包吧。

    二、tcpdump

    这里可以查看其在linux中的manpage:

    http://www.tcpdump.org/manpages/tcpdump.1.html

    也可以参考这里:

    https://danielmiessler.com/study/tcpdump/

    tcpdump的命令的语法大概是:

    一共两部分,前面那个大框里,都是各类选项。

    其实真正重要的是第二个,expression。这个expression就是指定一个捕获时的过滤表达式,比如host 192.168.19.22,

    这就是一个表达式,这个表达式的意思是:抓取本机和192.168.19.22之间的网络包。

    如果你不指定的话,那就会把和所有机器间的网络包都捕获。

    另外,最好能按照先选项,再表达式的顺序来写命令。因为表达式可以写得很复杂,和选项揉在一起,实在是不好看。

    三、典型用法

    1、指定端口号

    我觉得端口号其实很常用,在服务器端,一般我们都知道应用对外开放的端口号,比如spring boot应用,tomcat应用这些,端口号是我们再熟悉不过的。

    只要监听指定端口号的包,基本也就差不多了。

    这两天折腾ftp,ftp有两个端口,20和21,一个是控制信号传输,一个是真正的数据传输。下面以ftp为例:

    tcpdump -i eth1  -w ftp20  port 20 or port  21

    表示:在eth1上网卡上监听(可以ifconfig查看),端口号为20或21,-w表示将包抓取到文件ftp20中。因为我们打算将文件传输到windows机器上,用wireshark分析。

    2、指定host和端口号

    服务端通常会接收来自各个客户端的请求,如果自己在现上环境抓包,我们可能希望只抓取和某台主机间的通信包。当然,端口号还是要指定的。

    tcpdump    -i eth1 -w ftp21 host 10.15.4.46 and port 20 or port 21

    表示:和上面差不多。主要是监听和10.15.4.46之间的包。

     3、指定host、端口号、协议

    如第二步所述,基本可以抓到我们想要的包。如下图,我们其实只关心ftp协议包,但是呢,抓下来的包里面,包含了各种协议,还需要我用ftp这种表达式去过滤:

     能不能只抓ftp协议包?

    当然可以。(这部分待更新)

    4、linux下直接打印出抓的包的内容

    tcpdump -i ens192 host 10.15.8.104 and tcp -Ann

    -A:打印包的细节

    -n:不将ip转换为hostname,避免dns查找

    -nn:不转换协议和端口号,比如21端口就显示为21端口,不要显示为ftp

    (Don't convert protocol and port numbers etc. to names either.)

     此时,输出如下:

    如果添加以下选项:

    -X:数据包将会以16进制和ascii的方式显示。

    tcpdump -i ens192 host 10.15.8.104 and tcp -AXnn

     

    5、linux下抓包,不打印包的内容,只打印包头

     -vv    Even more verbose output.  For example, additional fields are printed from NFS reply packets, and SMB packets are fully decoded.
    
    -vvv   Even more verbose output.  For example, telnet SB ... SE options are printed in full.  With -X Telnet options are printed in hex as well.
    tcpdump -i ens192 host 10.15.8.104 and tcp -vnn

    -v:

    效果如下:

     如果将-v替换为使用-vv:

    如果要输出的信息要更少一点,可以使用:

    tcpdump -i ens192 host 10.15.8.104 and tcp -qnn

    -q:快速输出,只打印很少的协议内容

  • 相关阅读:
    Excel 相关实用计算公式
    C# ThreadState属性分析
    U8 数据库服务器和应用服务器 分离后出现 登陆系统管理 远程组件初始化 失败 解决方案!
    MyEclipse 快捷键
    项目中用到的开源框架
    spring.net nhibernate 不一定是自增变量,也可能是触发器 Batch update returned unexpected row count from update; actual row count: 2; expected: 1
    解决方法: A C3P0Registry mbean is already registered.This probably means that an application using c3p0的警告信息处理
    NHibenate hbm.xml 自动 生成 数据库表的时候 长度为1
    解决方法: Failed to load the sqljdbc_auth.dll
    SQL 中判断 纯数字
  • 原文地址:https://www.cnblogs.com/grey-wolf/p/9923012.html
Copyright © 2011-2022 走看看