分类: 技术

  • tcpdump抓包工具命令–详解

    tcpdump是工作中必用的一道指令,如果熟悉掌握,将会很快的帮你解决问题!文章写的有点多,但是我认为都很有用!

     

    参数列表

      设置不解析域名提升速度  
    -n 不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多  
    -nn 不把协议和端口号转化成名字,速度也会快很多。  
    -N 不打印出host 的域名部分.。比如,,如果设置了此选现,tcpdump 将会打印’nic’ 而不是 ‘nic.ddn.mil’.  
         
      过滤指定网卡的数据包  
    -i 指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any  
         
      过滤特定流向的数据包  
    -Q 选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 –direction=[direction] 这种写法  
         
      常用的一些参数  
    -A 以ASCII码方式显示每一个数据包(不显示链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据  
    -l 基于行的输出,便于你保存查看,或者交给其它工具分析
    tcpdump -nn -A -s1500 -l | egrep -i ‘User-Agent:|Host’
    通过 egrep 可以同时提取用户代理和主机名(或其他头文件):
     
    -q 简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短.  
    -c 捕获 count 个包 tcpdump 就退出  
    -s tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。  
    -S 使用绝对序列号,而不是相对序列号  
    -C file-size,tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创建一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576)  
    -F 使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.  
         
      过滤结果输出到文件  
    -w 使用 -w 参数后接一个以 .pcap 后缀命令的文件名,就可以将 tcpdump 抓到的数据保存到文件中。使用 wireshark 打开此文件便可进行分析 tcpdump icmp -w icmp.pcap
    -r 从文件中读取数据,读取后,我们照样可以使用上述的过滤器语法进行过滤分析。 tcpdump icmp -r all.pcap
         
      对输出内容进行控制的参数  
    -D 显示所有可用网络接口的列表  
    -e 每行的打印输出中将包括数据包的数据链路层头部信息  
    -E 揭秘IPSEC数据  
    -L 列出指定网络接口所支持的数据链路层的类型后退出  
    -Z 后接用户名,在抓包时会受到权限的限制。如果以root用户启动tcpdump,tcpdump将会有超级用户权限。  
    -d 打印出易读的包匹配码  
    -dd 以C语言的形式打印出包匹配码.  
    -ddd 以十进制数的形式打印出包匹配码  
         
      控制详细内容的输出  
    -v 产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。  
    -vv 产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。(摘自网络,目前我还未使用过)  
    -vvv 产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来(摘自网络,目前我还未使用过)  
         
      控制时间的显示  
    -t 在每行的输出中不输出时间  
    -tt 在每行的输出中会输出时间戳  
    -ttt 输出每两行打印的时间间隔(以毫秒为单位)  
    -tttt 在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)  
         
      显示数据包的头部  
    -x 以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部)  
    -xx 以16进制的形式打印每个包的头部数据(包括数据链路层的头部)  
    -X 以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。  
    -XX 以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便。  

    过滤规则组合

    有编程基础的同学,对于下面三个逻辑运算符应该不陌生了吧

    • and:所有的条件都需要满足,也可以表示为 &&
    • or:只要有一个条件满足就可以,也可以表示为 ||
    • not:取反,也可以使用 !

    举个例子,我想需要抓一个来自10.5.2.3,发往任意主机的3389端口的包

    $ tcpdump src 10.5.2.3 and dst port 3389
    

    当你在使用多个过滤器进行组合时,有可能需要用到括号,而括号在 shell 中是特殊符号,因为你需要使用引号将其包含。例子如下:

    $ tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'

    而在单个过滤器里,常常会判断一条件是否成立,这时候,就要使用下面两个符号

    • =:判断二者相等
    • ==:判断二者相等
    • !=:判断二者不相等

    当你使用这两个符号时,tcpdump 还提供了一些关键字的接口来方便我们进行判断,比如

    • if:表示网卡接口名、
    • proc:表示进程名
    • pid:表示进程 id
    • svc:表示 service class
    • dir:表示方向,in 和 out
    • eproc:表示 effective process name
    • epid:表示 effective process ID

    内容输出结构

    21
    :
    26
    :
    49.013621 IP 172.20
    .20
    .1
    .15605 > 172.20
    .20
    .2
    .5920
    : Flags [
    P
    .
    ]
    , seq 49
    :
    97
    , ack 106048
    , win 4723
    , length 48

    从上面的输出来看,可以总结出:

    1. 第一列:时分秒毫秒 21:26:49.013621
    2. 第二列:网络协议 IP
    3. 第三列:发送方的ip地址+端口号,其中172.20.20.1是 ip,而15605 是端口号
    4. 第四列:箭头 >, 表示数据流向
    5. 第五列:接收方的ip地址+端口号,其中 172.20.20.2 是 ip,而5920 是端口号
    6. 第六列:冒号
    7. 第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多标识符见下面

    理解 Flag 标识符

    截取数据只是第一步,第二步就是理解这些数据,下面就解释一下 tcpdump 命令输出各部分的意义。

    21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (
    6
    ), length 64
    )
        192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0
    
    21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (
    6
    ), length 44
    )
        124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440
    ], length 0
    
    21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (
    6
    ), length 40
    )
        192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0
    

     

    最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是 192.168.1.106,源端口是 56166,目的地址是 124.192.132.54,目的端口是 80。 > 符号代表数据的方向。

    此外,上面的三条数据还是 tcp 协议的三次握手过程,第一条就是 SYN 报文,这个可以通过 Flags [S] 看出。下面是常见的 TCP 报文的 Flags:

    • [S] : SYN(开始连接)
    • [.] : 没有 Flag
    • [P] : PSH(推送数据)
    • [F] : FIN (结束连接)
    • [R] : RST(重置连接)

    而第二条数据的 [S.] 表示 SYN-ACK,就是 SYN 报文的应答报文。

     

    先看看 tcpdump 的具体参数及意义:

    -i :指定 tcpdump 监听的网络接口

    -s :指定要监听数据包的长度

    -c :指定要监听的数据包数量,达到指定数量后自动停止抓包

    -w :指定将监听到的数据包写入文件中保存

    -A :指定将每个监听到的数据包以 ACSII 可见字符打印

    -n :指定将每个监听到数据包中的域名转换成 IP 地址后显示

    -nn :指定将每个监听到的数据包中的域名转换成 IP 、端口从应用名称转换成端口号后显示

    -e :指定将监听到的数据包链路层的信息打印出来,包括源 mac 和目的 mac ,以及网络层的协议

    -p :将网卡设置为非混杂模式,不能与 host broadcast 一起使用

    -r :指定从某个文件中读取数据包

    -S :指定打印每个监听到的数据包的 TCP 绝对序列号而非相对序列号

    OK ,参数介绍先到这里,下面看几个具体例子

    先来看一个比较基本的用法:

    #tcpdump -i eth0
    @eth0为参数值,表示需要抓包的网口,这是个必需参数哦。

    tcpdump 支持很多的关键字,下面先看几个例子:

    #tcpdump -i eth0 host 192.168.0.250 
    @在网口eth0上抓取主机地址为192.168.0.250的所有数据包。
    #tcpdump -i eth0 net 192.168.0.0/24 
    @在网口eth0上抓取网络地址为192.168.0.0/24的所有数据包
    #tcpdump -i eth0 port 80 
    @在网口eth0上抓取端口为80的所有数据包(注意,这里不区分是源端口还是目的端口)
    当然,我们也可以指定源端口或目的端口
    #tcpdump -i eth0 src port 80 and dst port 6100
    @在网口eth0上抓取源端口为80且目的端口为6100的数据包,这里用到了and逻辑运算符,后面再介绍
    #tcpdump -i eth0 icmp 
    @在网口eth0上抓取所有icmp协议的数据包
    以上几个例子,可以大致体现出tcpdump的基本用法。

    实际上, tcpdump 主要包括三种类型的关键字,第一种是关于类型的关键字,主要包括 host net port ,如上面的例( 1 )( 2 )( 3 ),第二种 是确定传输方向的关键字,主要包括 src dst src or dst src and dst ,这些关键字指明了传输的方向,如上面的例( 4 )。第三种是协议关键字,包括 fddi ip arp rarp tcp udp imcp 等,如上面的例( 5 )。

    除了这三种类型的关键字外,还有其他重要的关键字,如: gateway broadcast less greater ,还有三种逻辑运算,取非运算是 ‘not’ ‘!’ ,与运算符是 ‘and’ ‘&&’

    或运算符是 ‘or’ ‘||’ ,这些关键字可以组合起来构成强大的组合条件来满足我们的需求。

    #tcpdump -i eth0 -s 1400 -nn host 192.168.0.250 and ! 192.168.0.74 and icmp -e
    @抓取网口eth0上192.168.0.250与除192.168.0.74外的其他主机之间的icmp报文
    #tcpdump -i eth0 -s 1400 -nn tcp and \(host 192.168.0.250 and ! 192.168.0.74\)
    @抓取网口eth0上192.168.0.250与除192.168.0.74外的所有tcp数据包,
    这里用到了括号,注意,在tcpdump中使用括号时必须用转义
    #tcpdump -i eth0 ether src or dst 00:21:85:6C:D9:A3
    @抓取网口eth0上源mac地址或目的mac地址为00:21:85:6C:D9:A3的所有数据包,
    注意,这里的mac地址格式必须以':'分隔。
  • Win11怎么安装安卓应用?Win11安装安卓应用教程

    Win11安装安卓应用教程

      1、首先,我们要确保自己的电脑支持虚拟化。

      2、如果没有开启的话,可以进入windows功能中开启它。

      1) 操作简单,大家先按下快捷键“win+r”输入control,然后进入控制面板。

      2) 然后点击“程序”。

      3) 在程序右侧点击“启用或关闭windows功能”。

      4) 最后勾选“虚拟机平台”并确定。

      3、接着我们去系统设置中将区域更改为“美国”

      4、修改完成后进入微软商店,下载“Windows Subsystem for Android™ 。..。.”应用。

      5、下载完成后打开该软件。

      6、根据提示完成设置,进入以下界面后就可以关闭了。

      7、然后我们点开开始菜单,搜索“Android”,打开最佳匹配的设置。

      8、在其中开启开发人员模式,确认已连接到ADB。保存ADB前的地址。

      9、然后我们打开“windows powershell”,

      在其中输入“adb connect 127.0.0.1:58526(这里的数字填写自己电脑的端口)”。

      10、接着输入“adb install 。/coolapk.apk”(这里的coolapk.apk是我们准备的安卓安装包,也是填自己想要安装的应用程序名称)

      11、最后软件就会自动为你安装安卓应用了,安装完成后即可在win11中运行安卓app。

      12、另外,只有最新的win11才可以使用这个功能,所以大家要使用的话需要更新最新win11。【点击下载

  • 无法访问 Github ?

    该脚本只能提高 Github 文件下载速度,但是大家可能发现了自从 2021 年 3 月初某会开始,很多地区已经间歇性无法访问 Github 了。
    这种情况无论是改 DNS 还是改 Hosts 都没用,因为是蔷对 Github 域名 SNI 干扰/封锁,任意 IP 指向 Github 去访问时,该 IP 的 443 端口就会超时 3 分钟!
    因为是随机干扰的,所以有时候会碰到 “短暂” 可用的 IP(模拟丢包、伪装为网站自身网络问题)。

    有兴趣可以看看这篇详细讲解分析的文章: https://www.v2ex.com/t/758568

    因此目前只有三种方法可以访问 Github 了:

    1. 梯子
    2. 镜像站( https://kgithub.com / https://hub.fgit.gq / https://hub.fgit.ml / 访问 Github 自动重定向至镜像站的方法
    3. 肉身出国
    4. 本地代理直连加速,绕过 SNI 干扰( https://github.com/docmirror/dev-sidecar / https://gitee.com/docmirror/dev-sidecar )
  • TVBOX 接口配置

    TVbox在线接口:https://tv.203511.xyz/0821.json

    版本
    1.开源版 自用https://raw.liucn.cc/box/m.json https://raw.iqiq.io/liu673cn/box/main/m.json
    ?官方原版TVBox_q215613905_20230302-0924.apk ?UI美化版TVBox_takagen99_20230527-1118.apk 
    ?更多TVbox ?更多TVbox ?更多下载 ?更多下载 ?Pluto Player 
    2.多仓版 他人整理https://raw.liucn.cc/box/dm.txt https://raw.iqiq.io/liu673cn/box/main/dm.txt
    ?原版影视仓V3-3.0.32.apk ?原版影视仓4.0.32_1.apk
    ?UI改版可视TVMax_1.6.4.apk ?更多 ?更多
    3.内置版
    ?苹果_4.4.apk 魔改版

    https://jihulab.com/duomv/apps/-/raw/main/fast.json
  • docker 容器启动限制日志大小

    docker run -d --name=wxedge --restart=always --privileged --net=host  --tmpfs /run --tmpfs /tmp -v /storage:/storage:rw --log-opt max-size=10m --log-opt max-file=3 onething1/wxedge
  • 如何解决Linux系统盘符飘移问题

    Q:

    什么是盘符漂移?盘符漂移导致的影响有哪些?有哪些方式可以解决盘符漂移引起的问题?

    A:

    1. 什么是盘符漂移? 在Linux系统中,若存在多块硬盘,通常内核分配盘符的顺序是/dev/sda、/dev/sdb、/dev/sdc……。在系统启动过程中,内核会安装扫描到硬盘的顺序分配盘符。在系统启动后,热插拔硬盘,系统会顺序分配盘符。在同一个硬盘槽位,每次插入硬盘后,在系统中的盘符都可能不一致。例如,第一次插入时,盘符可能为/dev/sdb,将硬盘拔出,再次插入硬盘,盘符可能变为/dev/sde,出现盘符漂移。若系统连接阵列,由于LUN上报的顺序,导致每次扫LUN的结果,也可能不一致,出现盘符漂移。若系统连接阵列,当系统启动时,也可能由于驱动加载顺序的原因,导致本地盘与阵列盘出现换位(例如,阵列没有LUN映射时,本地盘盘符是/dev/sda;当阵列有LUN映射时,本地盘符生成在了阵列LUN之后),出现盘符漂移。
    2. 盘符漂移导致的影响有哪些?
      1. 如果是系统盘,出现漂移,会导致系统无法启动;
      2. 业务盘如果是对盘符进行操作,盘符漂移,会引起业务问题。
    3. 有哪些方式可以解决盘符漂移引起的问题?
      1. 如果系统盘漂移,导致了系统无法启动;或者业务盘漂移,导致业务失败,可使用UUID绑定方式,规避盘符漂移带来的影响。例如: 在/boot/grub/menu.lst或/etc/fstab文件中添加配置条目,使用UUID实现分区文件系统的挂载。例如root=UUID=19e9dda3-5a38-484d-a9b0-fa6b067d0331或UUID=894d76a6-b175-4eb1-89e5-3fd8d146eab7 /archive ext3 defaults 0 0(ls –l /dev/disk/by-* ,可以查询系统设备绑定信息)
      2. 如果系统使用Device Mapper Multipath对物理盘进行管理,可使用Multipath的盘符绑定设置,避免盘符的漂移和多台主机间盘符一致性的问题。例如: 在/etc/multipath.conf 文件中,添加multipaths {multipath {wwid 360060e80058e980000008e9800000007alias mpath0}}使用阵列LUN的WWN号,与特定盘符进行绑定。
      3. 如果阵列相关驱动(FC或iSCSI)先于本地盘驱动加载,会导致本地盘漂移到阵列盘后边(若不可接受),可以调整系统驱动的加载顺序(系统启动镜像),解决阵列LUN与本地盘的漂移问题。例如: SuSE系统,在/etc/sysconfig/kernel文件中可观察模块加载顺序。Redhat 6之前版本,在/etc/modprobe.conf 文件中可观察模块启动顺序。Redhat 6系统,使用dracut加载驱动,在/usr/share/dracut/modules.d目录下可查看。可修改menu.lst文件,通过在启动项中添加类似“rdloaddriver=megaraid_sas , rdloaddriver=megaraid_sas”的参数可指定驱动优先被加载。
      4. 可以使用udev为设备别名,建立符号链接的方式,避免盘符漂移对应用产生影响。

    下面介绍几种方法来获得UUID.

      1.最简单的方法就是使用blkid命令,它主要用来对系统的块设备(包括交换分区)所使用的文件系统类型,LABEL,UUID等信息查询. 使用这个命令需要安装e2fsprogs包.

      复制代码

      代码如下:

      root@10.1.1.200:~# dpkg -l | grep e2fsprogs

      ii e2fsprogs 1.41.3-1 ext2/ext3/ext4 file system utilities

      ii libuuid-perl 0.02-4 Perl extension for using UUID interfaces as defined in e2fsprogs

      root@10.1.1.200:~# blkid

      /dev/sda1: UUID=”b20e80f1-c88d-4918-9d9b-75cd7906629e” TYPE=”ext3″

      /dev/sda5: TYPE=”swap” UUID=”1fb3d17b-b2fe-470d-b39c-f00c4a30efbf”

      /dev/sda6: UUID=”c7050200-7efb-468c-81d1-a3add309bee1″ TYPE=”ext3″ SEC_TYPE=”ext2″

      /dev/sda7: UUID=”934e4e22-3431-4707-8d47-dca47e76f448″ TYPE=”xfs”

      /dev/hioa: UUID=”de0af117-ad92-4867-aa21-3e7d423e8864″ TYPE=”xfs”

      root@10.1.1.200:~# blkid /dev/sda1

      /dev/sda1: UUID=”b20e80f1-c88d-4918-9d9b-75cd7906629e” TYPE=”ext3″

      root@10.1.1.200:~# cat /etc/blkid.tab

      /dev/sda1

      /dev/sda5

      /dev/sda6

      /dev/sda7

      /dev/hioa

      2.通过浏览/dev/disk/by-uuid/下的设备文件信息.

      复制代码

      代码如下:

      root@10.1.1.200:~# ls -l /dev/disk/by-uuid/

      total 0

      lrwxrwxrwx 1 root root 10 2013-03-19 11:01 1fb3d17b-b2fe-470d-b39c-f00c4a30efbf -> ../../sda5

      lrwxrwxrwx 1 root root 10 2013-03-19 11:01 934e4e22-3431-4707-8d47-dca47e76f448 -> ../../sda7

      lrwxrwxrwx 1 root root 10 2013-03-19 11:01 b20e80f1-c88d-4918-9d9b-75cd7906629e -> ../../sda1

      lrwxrwxrwx 1 root root 10 2013-03-19 11:01 c7050200-7efb-468c-81d1-a3add309bee1 -> ../../sda6

      lrwxrwxrwx 1 root root 10 2013-03-19 11:02 de0af117-ad92-4867-aa21-3e7d423e8864 -> ../../hioa

      root@10.1.1.200:~# ls -l /dev/disk/by-uuid/ | grep sda1 | awk ‘{print $8}’

      b20e80f1-c88d-4918-9d9b-75cd7906629e

  • yum设置代理服务器

    export http_proxy=http://192.168.224.1:10809
    export https_proxy=http://192.168.224.1:10809
    export ftp_proxy=http://192.168.224.1:10809

    export http_proxy=192.168.224.1:10809
    export https_proxy=192.168.224.1:10809
    export ftp_proxy=192.168.224.1:10809

    export http_proxy=20.10.0.10:808
    export https_proxy=20.10.0.10:808
    export ftp_proxy=20.10.0.10:808

    unset http_proxy
    unset https_proxy
    unset ftp_proxy