zoukankan      html  css  js  c++  java
  • strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数,runlevel & init & service

    9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数

     strace

      是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息。strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字、参数、返回值和执行所消耗的时间等,是高级运维和开发人员排查问题的杀手铜。 

    strace命令的参数选项及说明

     
    -c    统计每一个系统调用所执行的时间、次数和出错的次数等
    -d    输出strace关于标准错误的调试信息
    -f    跟踪目标进程,以及目标进程创建的所有子进程
    -ff   如果提供-o filename,则将所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号
    -i    输出系统调用的入口指针
    -q    禁止输出关于脱离的消息
    -r    输出每一个系统调用的相对时间
    -t    在输出中的每一行前加上时间信息。例如16:45:28
    -tt   在输出中的每一行前加上时间信息,精确到微秒。例如11:18:59.759546端
    -ttt  在输出中的每一行前加上时间信息,精确到微秒,而且时间表示为UNIX时间戳。例如1486111461.650434
    -T    显示每次系统调用所花费的时间
    -v    对于某些相关调用,把完整的环境变量、文件stat结构等打印出来
    -x    以十六进制形式输出非标准字符率
    -xx   所有字符串以十六进制形式输出
     
    -e expr 输出过滤器,通过表达式,可以过滤掉你不想要的输出
            expr是一个表达式,用于控制如何跟踪:[qualifier=][!][valuel[,value2]..
            说明:
            ①qualifier 只能是trace、abbrev、verbose、raw、signal、read、write其中之一
            ②value是用来限定的符号或数字
            ③默认的qualifier是trace
            ④感叹号是否定符号
            例如:
            -e open等价于-e trace=open,表示只跟踪open调用
            而-e trace!=open表示跟踪除了open以外的其他调用
            常见选项:
            -e trace=[set]    只跟踪指定的系统调用
            -e trace=file     只跟踪与文件操作有关的系统调用
            -e trace=process  只跟踪与进程控制有关的系统调用
            -e trace-network  只跟踪与网络有关的系统调用
            -e trace=signal   只跟踪与系统信号有关的系统调用
            -e trace=desc     只跟踪与文件描述符有关的系统调用
            -e trace=ipc      只跟踪与进程通信有关的系统调用
            -e abbrev=[set]   设定strace输出的系统调用的结果集
            -e raw=[set]      将指定的系统调用的参数以十六进制显示
            -e signal=[set]   指定跟踪的系统信号
            -e read=[set]     输出从指定文件中读出的数据
            -e write=[set]    输出写入到指定文件中的数据
     
    -o filename    将strace的输出写入文件filename
    -p pid         指定要跟踪的进程pid,要同时跟踪多个pid,重复多次p选项即可*
    -s strsize     指定输出的字符串的最大长度,默认为32。并没有将文件名视为字符串,默认全部输出
    -u username    以usemame的UID和GID执行所跟踪的命令
     

    排查Nginx403 forbidden错误

    strace -tt -f /applicatton/nginx/sbin/nginx
     
     
     

    只跟踪与文件操作有关的系统调用

     strace -tt -f -e trace=file /application/nginx/sbin/nginx    #只跟综与文件操作有关的系统调用。
     
     

    通过pid 跟踪进程

     
    [root@bzhl ~]# pgrep nginx
    1884
    7785
    7786
    7787
     
    [root@bzhl ~]# pstree -p 1884
    nginx(1884)─┬─nginx(7785)
                ├─nginx(7786)
                └─nginx(7787)
     
    [root@bzhl ~]# strace -tt -f -e trace=file -p 7785
    strace: Process 7785 attached 

    跟踪系统调用统计

     strace不仅能够追踪系统调用,使用选项-c还能对进程所有的系统调用做一个统计分析。 
    [root@bzhl ~]# which nginx
    /usr/bin/nginx
    [root@bzhl ~]# strace -c /usr/bin/nginx
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
    22.33    0.001129           7       153        52 open
    15.55    0.000786           6       123           close
    10.80    0.000546           6        95           mmap
      8.53    0.000431          13        32           write
      7.66    0.000387          10        39           read
      6.47    0.000327           7        48           mprotect
      5.38    0.000272          12        22           munmap
      4.35    0.000220           3        87           fstat
      3.20    0.000162          32         5           nanosleep
      2.87    0.000145           8        19           socket
      2.67    0.000135           4        38           pread64
      2.29    0.000116          29         4         4 connect
      1.19    0.000060           4        15        15 bind
      1.03    0.000052           3        16         5 stat
      1.03    0.000052           9         6           getdents
      0.99    0.000050           3        15           setsockopt
      0.65    0.000033          11         3           openat
      0.63    0.000032           2        15           ioctl
      0.63    0.000032           5         6         6 mkdir
      0.47    0.000024           2        12           fcntl
      0.16    0.000008           8         1           statfs
      0.14    0.000007           7         1         1 readlink
      0.10    0.000005           5         1           epoll_create
      0.08    0.000004           2         2           rt_sigaction
      0.08    0.000004           2         2           uname
      0.08    0.000004           2         2           gettimeofday
      0.08    0.000004           4         1           futex
      0.06    0.000003           3         1           poll
      0.06    0.000003           3         1           lseek
      0.06    0.000003           2         2           getrlimit
      0.06    0.000003           3         1           getppid
      0.06    0.000003           3         1           sched_getaffinity
      0.04    0.000002           1         2           brk
      0.04    0.000002           2         1           rt_sigprocmask
      0.04    0.000002           2         1           getuid
      0.04    0.000002           2         1           arch_prctl
      0.04    0.000002           2         1           set_tid_address
      0.04    0.000002           2         1           set_robust_list
      0.02    0.000001           1         1           geteuid
      0.00    0.000000           0         1         1 access
      0.00    0.000000           0         1           execve
    ------ ----------- ----------- --------- --------- ----------------
    100.00    0.005055                   779        84 total

         上面的结果将清楚地告诉我们调用了哪些系统函数,调用的次数是多少,消耗了多少时间等信息,这对我们分析程序来说是非常有用的。 

     

    重定向输出。

     strace -c -o tongji.log /application/nginx/sbin/nginx  #用 -o 选项将strace的结果输出到文件中 

    对系统调用进行计时

     strace -T /application/nginx/sbin/ngirnx    #<=使用选项-T将每个系统调用所花费的时间打印出来,每个调用的时间花费在调用行最右边的尖括导里面。 
     
    小结:strace命令很适合处埋程序僵尸、命令执行报错等问题,如果从程序日志和系统日志中看不出问题出现的原因,则可以strace一下,也许会有答案,不过也需要使用者有足够的耐心去查看输出! 
     

    ltrace:跟踪进程调用库函数

    ltrace 能够跟踪进程的库函数调用,它会显现出调用了哪个库函数,而 strace则是跟踪进程的每个系统调用。 

    ltrace命令的参数选项及说明

    -c    统计库函数每次调用的时间,最后程序退出时打印摘要
    -C    解码低级别名称(内核级)为用户级名称
    -d    打印调试信息
    -e expr    输出过滤器,通过表达式,可以过滤掉你不想要的输出
              -e printf  表示只查看printf函数调用
              -e !printf 表示查看除printf函数以外的所有函数调用
    -f         跟踪子进程
    -o filename   将ltrace的输出写入文件filename
    -p pid     指定要跟踪的进程pid
    -r         输出每一个调用的相对时间
    -S         显示系统调用
    -t         在输出中的每一行前加上时间信息。例如16:45:28
    -tt        在输出中的每一行前加上时间信息,精确到微秒。例如11:18:59.759546
    -ttt       在输出中的每一行前加上时间信息,精确到微秒,而且时间表示为UNIX时间截。例如1486111461.650434
    -T          显示每次调用所花费的时间
    -u username 以username的UID和GID执行所跟踪的命令

      

    Itrace使用
    ltrace的用法与strace非常相似,选项功能也是类似
    [root@bzhl ~]# ltrace /usr/bin/nginx
     
    通过pid 跟踪进程调用库函数。
     
    [root@bzhl ~]# pgrep nginx
    1884
    7785
    7786
    7787
     
    [root@bzhl ~]# ltrace -p 1884 
     
     
     Nginx 403 forbidden多种原因及故障模拟重现

    访问Nginx出现状态码为403 forbidden原因及故障模拟

    1) nginx配置文件里不配置默认首页参数或者首页文件在站点目录下没有

    index index.php index.html index.htm;
    1.
    问题模拟示例:

    [root@www extra]# cat www.conf
    #www virtualhost by oldboy
    server {
    listen 80;
    server_name www.etiantian.org;
    location / {
    root html/www;
    #index index.html index.htm;#<==注释首页文件配置
    }
    access_log off;
    }
    [root@www extra]# ../../sbin/nginx -sreload
    [root@www extra]# tail -1 /etc/hosts
    10.0.0.8 www.etiantian.orgbbs.etiantian.org blog.etiantian.org etiantian.org
    [root@www extra]# ll ../../html/www/
    总用量 12
    drwxr-xr-x 2 root root 4096 4月 15 14:20 blog
    -rw-r--r-- 1 root root 4 4月 17 17:11index.html #<==存在首页文件
    drwxr-xr-x 2 root root 4096 4月 15 14:19 oldboy
    [root@www extra]# curl -I -s 10.0.0.8|head-1
    HTTP/1.1 403 Forbidden #<==问题是,Nginx没有指定首页文件的参数,因此访问Nginx时不会把index.html当首页,所以报403错误。

    2)站点目录下没有配置文件里指定的首页文件index.php index.html index.htm。

    [root@www extra]# cat www.conf
    #www virtualhost by oldboy
    server {
    listen 80;
    server_name www.etiantian.org;
    location / {
    root html/www;
    index index.htmlindex.htm; #<==配置首页文件配置
    }
    access_log off;
    }
    [root@www extra]# ../../sbin/nginx -sreload
    [root@www extra]# rm -f ../../html/www/index.html#<==删除物理首页文件
    [root@www extra]# curl -I -s 10.0.0.8|head-1
    HTTP/1.1 403 Forbidden

    提示:以上1)和2)有一个参数可以解决这个问题就是:

    autoindex on;
    [root@www extra]# cat www.conf
    #www virtualhost by oldboy
    server {
    listen 80;
    server_name www.etiantian.org;
    location / {
    root html/www;
    autoindex on; #<==当找不到首页文件时,会展示目录结构,这个功能一般不要用除非有需求。
    }
    access_log off;
    }

    效果如下:

    3)站点目录或内部的程序文件没有Nginx用户访问权限。

    [root@www extra]# echo test >../../html/www/index.html
    [root@www extra]# chmod 700../../html/www/index.html #<==设置700让nginx用户无权读取
    [root@www extra]# ls -l ../../html/www/index.html
    -rwx------ 1 root root 5 4月 17 17:15../../html/www/index.html
    [root@www extra]# curl -I -s 10.0.0.8|head-1
    HTTP/1.1 403 Forbidden #<==403错误
    [root@www extra]# chmod 755../../html/www/index.html #<==设置755让nginx用户有权读取
    [root@www extra]# curl -I -s 10.0.0.8|head-1
    HTTP/1.1 200 OK #<==200 OK了

    4)Nginx配置文件中设置allow、deny等权限控制,导致客户端没有没权限访问。

    [root@www extra]# cat www.conf
    #www virtualhost by oldboy
    server {
    listen 80;
    server_name www.etiantian.org;
    location / {
    root html/www;
    index index.html index.htm;
    allow 192.168.1.0/24;
    deny all;
    }
    access_log off;
    }
    [root@www extra]# curl -I -s 10.0.0.8|head-1
    HTTP/1.1 200 OK #<==设置755让nginx用户有权读取
    [root@www extra]# ../../sbin/nginx -sreload
    [root@www extra]# curl -I -s 10.0.0.8|head-1
    HTTP/1.1 403 Forbidden

    提示:上述403问题并不是nginx才有,apache服务的Forbidden 403问题同样也是这几个问题导致的,只是参数细节略有区别而已,见 http://oldboy.blog.51cto.com/2561410/581383

    https://blog.51cto.com/oldboy/1633952

    9.13-15 runlevel & init & service

    runlevel:输出当前运行级别

    runlevel命令用于输出当前Linux系统的运行级别。
    -quiet 不输出结果,用于通过返回值判断的场合
    [root@cs6 ~]# runlevel
    N 3
     
    具体如下。
    0:停机
    1:单用户模式
    2:无网络的多用户模式
    3:多用户模式
    4:未使用
    5:图形界面多用户模式
    6:重启
     
     

    init:初始化Linux进程

         init命令是Linux下的进程初始化工具,init进程是所有Linux进程的父进程,它的进程号为1。init命令的主要任务是依据配置文件“/etc/inittab”创建Linux进程。
     
    切换运行级别。
    [root@cs6 ~]# init 0    #<=关机
    [root@cs6 ~]# init 6    #<=重启 
     

    service:管理系统服务

             service命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、重新加载配置(reload)、查看状态(status)等,该命令在CentOS7里被systemctl取代。
       -status-all    显示所有服务状态
     

    查看当前服务状态

    [root@cs6 ~]# service --status-all
    auditd (pid  1270) 正在运行...
    crond (pid  1451) 正在运行...
    表格:filter
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    1    ACCEPT     all      ::/0                 ::/0                state RELATED,ESTABLISHED
    2    ACCEPT     icmpv6    ::/0                 ::/0                
    3    ACCEPT     all      ::/0                 ::/0                
    4    ACCEPT     udp      ::/0                 fe80::/64           state NEW udp dpt:546
    5    ACCEPT     tcp      ::/0                 ::/0                state NEW tcp dpt:22
    6    REJECT     all      ::/0                 ::/0                reject-with icmp6-adm-prohibited
     
    Chain FORWARD (policy ACCEPT)
    num  target     prot opt source               destination         
    1    REJECT     all      ::/0                 ::/0                reject-with icmp6-adm-prohibited
     
    Chain OUTPUT (policy ACCEPT)
    num  target     prot opt source               destination         
     
    iptables:未运行防火墙。
    iscsi 已停
    iscsid 已停
    lvmetad 已停
    dmeventd 已停
    mdmonitor 已停
    multipathd 已停

    管理系统服务

    [root@cs6 ~]# service crond status
    crond (pid  1451) 正在运行...
    [root@cs6 ~]# /etc/init.d/crond status
    crond (pid  1451) 正在运行...

    11.5 vmstat:虚拟内存统计

     

    vmstat

    vmstat是Virtual Memory Statistics(虚拟内存统计)的缩写,利用vmstat命令可以对操作系统的内存信息、进程状态和CPU活动等进行监视。但是只能对系统的整体情况进行统计,无法对某个进程进行深入分析。

    【语法格式】

    vmstat foption [delay fcountl]
    vmstat  [选项]   [时间间隔(次数]
     
    1)在vmstat命令及后面的选项里,每个元素之间都至少要有一个空格。
    2)delay表示两次输出之间的间隔时间。
    3)count表示按照delay指定的时间间隔统计的次数。

    【选项说明】

    -a    显示活跃和非活跃内存
    -f    显示从系统启动至今的fork进程数量
    -m    显示slab信息
    -n    只在开始时显示一次各字段名称
    -s    显示内存相关统计信息及多种系统活动数量深
    -d    显示磁盘相关统计信息
    -p    显示指定磁盘分区统计信息
    -S    使用指定单位显示。参数有k、K、m、M,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024byte)
    -t     统计信息带上时间戳
     
     
    [root@lewen ~]# vmstat   #<行如果省略“间隔时间”和“次数”的参数,则仅显示一次报告后
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
    r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
    2  0      0 2792792   2108 790956    0    0    15    20   61  146  0  0 99  0  0
     
     
    以下是命令结果的详细说明。
    第1列:procs。
      r列表示运行和等待CPU时间片的进程数。
      b列表示正在等待资源的进程数。
    第2列:memory。
      swpd列表示使用虚拟内存的大小。
      free列表示当前空闲的物理内存数量。
      buff列表示buffers的内存数量。
      cache列表示cache的内存数量。
    第3列:swap。
      si(swap in)列表示由磁盘调入内存,也就是内存进入内存交换区的数量。
      so(swap out)列表示由内存调入磁盘,也就是内存交换区进入内存的数量。
    第4列:I/O项显示磁盘读写状况。
      bi列表示从块设备读入数据的总量(即读磁盘)(块/s)。
      bo列表示写入块设备的数据总量(即写磁盘)(块/s)。
    第5列:system显示采集间隔内发生的中断数。
      in列表示在某一时间间隔中观测到的每秒设备中断数。
      cs列表示每秒产生的上下文切换次数。
    第6列:CPU项显示了CPU的使用状态。
      us列显示了用户进程消耗的CPU时间百分比。
      sy列显示了系统(内核)进程消耗的CPU时间百分比。
      id列显示了CPU处在空闲状态的时间百分比。
      wa列显示了I/0等待所占用的CPU时间百分比。
      st列显示了虚拟机占用的CPU时间的百分比。

    显示活跃和非活跃内存

    [root@lewen ~]# vmstat -aS M 2 3
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
    r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
    2  0      0   2727    290    657    0    0    15    20   61  146  0  0 99  0  0
    0  0      0   2727    290    657    0    0     0     0   53  118  0  0 100  0  0
    0  0      0   2727    290    657    0    0     0     0   51  112  1  1 99  0  0
     
     
    使用-a选项显示活跃和非活跃内存时,所显示的内容除去增加了inact和active之外,其他显示内容与范例11-12相同。
    memory列增加了inact和active两列,其说明具体如下。
    inact:非活跃的内存大小(当使用-a选项时显示)。
    active:活跃的内存大小(当使用-a选项时显示)。

    查看内存使用的详细信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@lewen ~]# vmstat -s 
          4026348 K total memory
           440568 K used memory
           673792 K active memory
           297756 K inactive memory
          2792680 K free memory
             2108 K buffer memory
           790992 K swap cache
      
      
    这些信息分别来自于/proc/meminfo/proc/stat/proc/vmstat

    查看磁盘的读/写

    [root@lewen ~]# vmstat -d
    disk- ------------reads------------ ------------writes----------- -----IO------
           total merged sectors      ms  total merged sectors      ms    cur    sec
    sda     8333      8  673201  140450  21689   1376  907042   61431      0     73
    sr0       18      0    2056     678      0      0       0       0      0      0
    dm-0    6339      0  648333  139872  23055      0  902906   75051      0     73
    dm-1      90      0    4920       7      0      0       0       0      0      0
     
    这些信息主要来自于/proc/diskstats。其中的merged表示一次来自于合并的写/读请求,系统一般会把多个连接/邻近的读/写请求合并到一起来操作。

    查看/dev/sda1磁盘的读写统计信息

    [root@lewen ~]# vmstat -p /dev/sda1
    sda1          reads   read sectors  writes    requested writes
                    1799      12364         10       4136
    这些信息主要来自于/proc/diskstats。各列的说明具体如下。
    reads:来自于该分区的读的次数。
    read sectors:来自于该分区的读扇区的次数。
    writes:来自于该分区的写的次数。
    requested writes:来自于该分区的写请求次数。

    11.6 mpstat:CPU信息统计

     
        mpstat 是Multiprocessor Statistics的缩写,是一种实时系统监控工具。mpstat命令会输出CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPU的系统里,此命令不但能用来查看所有CPU的平均状况信息,而且还能够用来查看特定CPU的信息。
        mpstat命令的最大特点是:可以查看多核心CPU中每个计算核心的统计数据,而类似命令vmstat只能查看系统整体的CPU情况。
     
     
    mpstat [option] [delay [count]]
     
    mpstat命令的参数选项及说明
     
    -P      指定CPU编号,例如:
            -P 0表示第一个CPU
            -P 1表示第二个CPU
            -P ALL表示所有CPU
     

    显示CPU信息统计。

    [root@cs6 ~]# mpstat 
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月05日 _x86_64_ (2 CPU)
     
    16时38分37秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
    16时38分37秒 all 0.17 0.00 0.18 0.03 0.00 0.00 0.00 0.00 99.62
     
    [root@cs6 ~]# mpstat 5 6
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月05日 _x86_64_ (2 CPU)
     
    16时39分02秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
    16时39分07秒 all 0.00 0.00 0.10 0.00 0.00 0.00 0.00 0.00 99.90
    16时39分12秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
    16时39分17秒 all 0.00 0.00 0.10 0.00 0.00 0.00 0.00 0.00 99.90
    16时39分22秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
    16时39分27秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
    16时39分32秒 all 0.00 0.00 0.10 0.00 0.00 0.00 0.00 0.00 99.90
    平均时间: all 0.00 0.00 0.05 0.00 0.00 0.00 0.00 0.00 99.95
     
    以下是命令结果的详细说明。
    第1列:16时39分02秒,表示当前时间。
    第2列:CPU,all表示所有CPU,0表示第一个CPU……
    后面9列的含义分别如下。
    %usr:用户进程消耗的CPU时间百分比。
    %nice:改变过优先级的进程占用的CPU时间百分比。
    %sys:系统(内核)进程消耗的CPU时间百分比。
    %iowait:I0等待所占用的CPU时间百分比。
    %irq:硬中断占用的CPU时间百分比。
    %soft:软中断占用的CPU时间百分比。
    %steal:虚拟机强制CPU等待的时间百分比。
    %guest:虚拟机占用CPU时间的百分比。
    %idle:CPU处在空闲状态的时间百分比。
     

    显示指定CPU信息的统计。

     
    [root@cs6 ~]# mpstat -P 0
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月05日 _x86_64_ (2 CPU)
     
    16时40分51秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
    16时40分51秒 0 0.10 0.00 0.14 0.04 0.00 0.00 0.00 0.00 99.72

    11.7 iostat: I/O信息统计

     
    iostat是I/O statistics(输入/输出统计)的缩写,其主要功能是对系统的磁盘I/O操作进行监视。它的输出主要是显示磁盘读写操作的统计信息,同时也会给出CPU的使用情况。同vmstat命令一样,iostat命令也不能对某个进程进行深入分析,仅会对系统的整体情况进行分析。
     
    iostat [option] [interval [count]]
    1)在iostat命令及后面的选项里,每个元素之间都至少要有一个空格。
    2)interval 表示两次输出之间的间隔时间。
    3)count表示按照delay指定的时间间隔统计的次数。
     
     
    iostat命令的参数选项及说明
    -c    显示CPU的使用情况
    -d    显示磁盘的使用情况
    -k    每秒以kB为单位显示数据
    -m    每秒以MB为单位显示数据
    -n    显示NFS的使用情况
    -t    显示每次统计的执行时间
    -p    device指定要统计的磁盘设备名称,默认为所有的磁盘设备
    -x    显示扩展统计
     
     
    [root@cs6 ~]# iostat
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月06日 _x86_64_ (2 CPU)
     
    avg-cpu: %user %nice %system %iowait %steal %idle
               0.26 0.00 0.28 0.04 0.00 99.42
     
    Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    sda 1.81 58.79 37.24 181198 114780
    dm-0 6.02 55.86 37.23 172178 114752
    dm-1 0.10 0.78 0.00 2400 0
     
     
    以下是命令结果说明。
    第1~2行中各列的含义具体如下。
    %user:用户进程消耗的CPU时间百分比。
    %nice:改变过优先级的进程占用的CPU时间百分比。
    %system:系统(内核)进程消耗的CPU时间百分比。
    %iowait:I0等待所占用的CPU时间百分比。
    %steal:虚拟机强制CPU等待的时间百分比。
    %idle:CPU处在空闲状态的时间百分比。
    第3~4行中各列的含义如下。
    tps:表示该设备每秒的传输次数,“一次传输”的意思是“一次I/O请求”,多个逻辑请求可能会被合并为“一次I/O请求”,“一次传输”请求的大小是未知的。
    Blk_read/s:表示每秒读取的数据块数。
    Blk_wrtn/s:表示每秒写人的数据块数。
    Blkread:表示读取的所有块数。
    Blk_wrtn:表示写入的所有块数。
     

    定时显示所有信息

    [root@cs6 ~]# iostat 2 3
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月05日 _x86_64_ (2 CPU)
     
    avg-cpu: %user %nice %system %iowait %steal %idle
               0.24 0.00 0.26 0.04 0.00 99.47
     
    Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    sda 1.70 51.07 36.11 182710 129196
    dm-0 5.70 48.55 36.10 173690 129168
    dm-1 0.08 0.67 0.00 2400 0
     
    avg-cpu: %user %nice %system %iowait %steal %idle
               0.00 0.00 0.00 0.00 0.00 100.00
     
    Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    sda 0.00 0.00 0.00 0 0
    dm-0 0.00 0.00 0.00 0 0
    dm-1 0.00 0.00 0.00 0 0
     
    avg-cpu: %user %nice %system %iowait %steal %idle
               0.00 0.00 0.00 0.00 0.00 100.00
     
    Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    sda 0.00 0.00 0.00 0 0
    dm-0 0.00 0.00 0.00 0 0
    dm-1 0.00 0.00 0.00 0 0
     

    只显示磁盘统计信息。

    [root@cs6 ~]# iostat -d
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月05日 _x86_64_ (2 CPU)
     
    Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
    sda 1.69 50.88 35.98 182710 129196
    dm-0 5.68 48.36 35.97 173690 129168
    dm-1 0.08 0.67 0.00 2400 0
     
     
     
    [root@cs6 ~]# iostat -d -k
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月05日 _x86_64_ (2 CPU)
     
    Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
    sda 1.63 24.51 17.33 91355 64598
    dm-0 5.47 23.30 17.33 86845 64584
    dm-1 0.08 0.32 0.00 1200 0
     
    [root@cs6 ~]# iostat -d -m
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月05日 _x86_64_ (2 CPU)
     
    Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
    sda 1.63 0.02 0.02 89 63
    dm-0 5.45 0.02 0.02 84 63
    dm-1 0.08 0.00 0.00 1 0
     
     
    查看扩展信息
    [root@cs6 ~]# iostat -d -x -k
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月05日 _x86_64_ (2 CPU)
     
    Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
    sda 0.28 2.99 0.89 0.39 19.03 13.52 50.97 0.00 1.38 1.23 1.73 0.73 0.09
    dm-0 0.00 0.00 0.89 3.38 18.09 13.52 14.82 0.01 2.51 1.89 2.67 0.21 0.09
    dm-1 0.00 0.00 0.06 0.00 0.25 0.00 8.00 0.00 0.09 0.09 0.00 0.09 0.00
     
    以下是命令结果说明。
    rrqm/s:每秒进行merge的读操作数目。
    wrqm/s:每秒进行merge的写操作数目。
    r/s:每秒完成的读I/O设备次数。
    w/s:每秒完成的写I/O设备次数。
    rkB/s:每秒读入的千字节数。
    wkB/s:每秒写人的千字节数。
    avgrq-sz:设备平均每次进行I/O操作的数据大小(扇区)。
    avgqu-sz;平均I/O队列长度。
    await:设备平均每次I/O操作的等待时间(毫秒)。
    svctm:设备平均每次1/0操作的服务时间(毫秒)。
    %util:每秒钟用于I/O操作的百分比。
     
     
    只查看CPU的统计信息
    [root@cs6 ~]# iostat -c
    Linux 2.6.32-754.el6.x86_64 (cs6) 2019年05月05日 _x86_64_ (2 CPU)
     
    avg-cpu: %user %nice %system %iowait %steal %idle
               0.17 0.00 0.19 0.03 0.00 99.60

    11.8 iotop:动态显示磁盘I/O统计信息

     
    iotop命令是一款实时监控磁盘I/O的工具,但必须以root用户的身份运行。使用iotop命令可以很方便地查看每个进程使用磁盘I/O的情况。
    最小化安装系统一般是没有这个命令的,需要使用yum命令额外安装,安装命令如下;yum -y install iotop
     
     
    iotop命令的参数选项及说明
     
    -o    显示正在使用I/O的进程或者线程,默认是显示所有
    -d    设置显示的间隔秒数
    -p    只显示指定PID的信息
    -u    显示指定用户的信息
    -P(大写)    只显示进程,一般是显示所有的线程
    -a    显示从iotop启动后每个线程完成了的I/O总数
    -k    设置显示单位为KB
    -t    在每一行前添加一个当前的时间
     
     
     
    [root@cs6 ~]# iotop
     
    Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
      TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND                                              
        1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
        2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
        3 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
        4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
        5 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [stopper/0]
        6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
     
     
     
    以下是命令结果的具体说明。
    Total DISK READ:总的磁盘读取速度。
    Total DISK WRITE:总的磁盘写入速度。
    TID:进程pid值。
    PRIO:优先级。
    USER:用户。
    DISKREAD:磁盘读取速度。
    DISK WRITE:磁盘写入速度。
    SWAPIN:从swap分区读取数据占用的百分比。
    IO:I/O占用的百分比。
    COMMAND:消耗I/O的进程名。

    s11.9 sar:收集系统信息

    功能说明:

        通过sar命令,可以全面地获取系统的CPU、运行队列、磁盘I/O、分页(交换区)、内存、CPU中断和网络等性能数据。

    语法格式

    sar  option interval count

    sar  选项    时间间隔  次数

    说明:

    1)在sar命令及后面的选项里,每个元素之间都至少要有一个空格。

    2)interval表示两次输出之间的间隔时间。

    3)count表示按照interval指定的时间间隔统计的次数。

    【选项说明】

    查看系统CPU的整体负载状况。

    -A 显示系统所有资源设备(CPU、内存、磁盘)的运行状况

    -u 显示系统所有CPU在采样时间内的负载状态

    -P 显示当前系统中指定CPU的使用情况

    -d 显示系统所有硬盘设备在采样时间内的使用状况

    -r 显示在采样时间内系统内存的使用状况

    -b 显示在采样时间内缓冲区的使用情况

    -v 显示索引节点、文件和其他内核表的状态

    -n 显示网络运行状态

    -q 显示运行队列的大小,它与系统当时的平均负载相同

    -R 显示进程在采样时间内的活动情况

    -y 显示终端设备在采样时间内的活动情况

    -w 显示系统交换活动在采样时间内的状态

    -o filename 将命令结果以二进制格式存放在文件中,filename是文件名

    使用范例

    查看系统CPU的整体负载状况

    [root@lewen ~]# sar -u 2 3
    Linux 3.10.0-957.el7.x86_64 (lewen)     2019年03月17日     _x86_64_    (1 CPU)
    
    16时09分16秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
    16时09分18秒     all      0.00      0.00      0.50      0.00      0.00     99.50
    16时09分20秒     all      0.00      0.00      0.00      0.00      0.00    100.00
    16时09分22秒     all      0.50      0.00      0.50      0.00      0.00     99.00
    平均时间:     all      0.17      0.00      0.33      0.00      0.00     99.50
    
    %user:用户进程消耗的CPU时间百分比。
    %nice:改变过优先级的进程占用的CPU时间百分比。
    %system:系统(内核)进程消耗的CPU时间百分比。
    %iowait:IO等待所占用的CPU时间百分比。
    %steal:虚拟机强制CPU等待的时间百分比。
    %idle:CPU处在空闲状态的时间百分比。

    显示运行队列的大小

    [root@lewen ~]# sar -q 2 3
    Linux 3.10.0-957.el7.x86_64 (lewen)     2019年03月17日     _x86_64_    (1 CPU)
    
    16时25分06秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
    16时25分08秒         0       316      0.00      0.01      0.05         0
    16时25分10秒         0       316      0.00      0.01      0.05         0
    16时25分12秒         0       316      0.00      0.01      0.05         0
    平均时间:         0       316      0.00      0.01      0.05         0
    
    runq-sz:运行队列的长度(等待运行的进程数)。
    plist-sz:进程列表中进程(process)和线程(thread)的数量。
    ldavg-1:最后1分钟的系统平均负载(system load average)。
    ldavg-5:过去5分钟的系统平均负载。
    ldavg-15:过去15分钟的系统平均负载。

    显示系统内存的使用状况

    [root@lewen ~]# sar -r 2 3
    Linux 3.10.0-957.el7.x86_64 (lewen)     2019年03月17日     _x86_64_    (1 CPU)
    
    16时29分54秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
    16时29分56秒   2794180   1232168     30.60      2108    643944   2014348     28.09    672264    297744         8
    16时29分58秒   2794180   1232168     30.60      2108    643944   2014348     28.09    672268    297744         8
    16时30分00秒   2794180   1232168     30.60      2108    643944   2014348     28.09    672268    297744         8
    平均时间:   2794180   1232168     30.60      2108    643944   2014348     28.09    672267    297744         8
    
    
    以下是命令结果的详细说明。
    kbmemfree:空闲物理内存量。
    kbmemused:使用中的物理内存量。
    %memused:物理内存量的使用率。
    kbbuffers:内核中作为缓冲区使用的物理内存容量。
    kbcached:内核中作为缓存使用的物理内存容量。
    kbcommit:应用程序当前使用的内存大小。
    %commit:应用程序当前使用的内存大小占总大小的使用百分比。

    显示缓冲区的使用情况

    [root@doit ~]# sar -b 2 3
    Linux 4.20.0-1.el7.elrepo.x86_64 (doit)     03/17/2019     _x86_64_    (2 CPU)
    
    04:33:47 PM       tps      rtps      wtps   bread/s   bwrtn/s
    04:33:49 PM      0.50      0.00      0.50      0.00      4.00
    04:33:51 PM      0.00      0.00      0.00      0.00      0.00
    04:33:53 PM      0.00      0.00      0.00      0.00      0.00
    Average:         0.17      0.00      0.17      0.00      1.33
    
    
    tps:每秒钟物理设备的I/O传输总量。
    rtps:每秒钟从物理设备读入的数据总量。
    wtps:每秒钟向物理设备写入的数据总量。
    bread/s:每秒钟从物理设备读入的数据量,单位为块/s。
    bwrtn/s:每秒钟向物理设备写人的数据量,单位为块/s。

    显示网络的运行状态

    [root@doit ~]# sar -n DEV 2 3
    Linux 4.20.0-1.el7.elrepo.x86_64 (doit)     03/17/2019     _x86_64_    (2 CPU)
    
    04:35:59 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
    04:36:01 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    04:36:01 PM      eth0     48.50     40.50     34.71     33.66      0.00      0.00      0.00
    
    以下是命令结果的详细说明。
    IFACE:网络接。
    rxpck/s:每秒钟接收的数据包。
    txpck/s:每秒钟发送的数据包。
    rxkB/s:每秒钟接收的字节数。
    txkB/s:每秒钟发送的字节数。
    rxcmp/s:每秒钟接收的压缩数据包。
    txcmp/s:每秒钟发送的压缩数据包。
    rxmcst/s:每秒钟接收的多播数据包。

    下面的命令用来

    显示网络错误的统计数据

    [root@doit ~]# sar -n EDEV 2 3
    Linux 4.20.0-1.el7.elrepo.x86_64 (doit)     03/17/2019     _x86_64_    (2 CPU)
    
    04:39:26 PM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
    04:39:28 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    04:39:28 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    
    
    以下是命令结果的详细说明。
    IFACE:网络接。
    rxerr/s:每秒钟接收的坏数据包。
    txerr/s:每秒钟发送的坏数据包。
    coll/s:每秒的冲突数。
    rxdrop/s:因为缓冲充满,每秒钟丢弃的已接收数据包数。
    txdrop/s:因为缓冲充满,每秒钟丢弃的已发送数据包数。
    txcarr/s:发送数据包时,每秒载波错误数。
    rxfram/s:每秒接收数据包的帧对齐错误数。
    rxfifo/s:接收的数据包每秒FIFO过速的错误数。
    txfifo/s:发送的数据包每秒FIFO过速的错误数。

    下面的命令用于显示套接字信息

    [root@doit ~]# sar -n SOCK 2 3
    Linux 4.20.0-1.el7.elrepo.x86_64 (doit)     03/17/2019     _x86_64_    (2 CPU)
    
    04:42:06 PM    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
    04:42:08 PM       101         5         3         0         0         2
    04:42:10 PM       101         5         3         0         0         2
    04:42:12 PM       101         5         3         0         0         2
    Average:          101         5         3         0         0         2
    
    以下是命令结果的详细说明。
    totsck:使用的套接字总数量。
    tcpsck:使用的TCP套接字数量。
    udpsck:使用的UDP套接字数量。
    rawsck:使用的raw套接字数量。
    ip-frag:使用的IP段数量。
    tcp-tw:处于TIME_WAIT状态的TCP套接字数量。

    查看系统磁盘的读写性能

    [root@doit ~]# sar -d 2 3
    Linux 4.20.0-1.el7.elrepo.x86_64 (doit)     03/17/2019     _x86_64_    (2 CPU)
    
    04:43:34 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
    04:43:36 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    
    04:43:36 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
    04:43:38 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    
    04:43:38 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
    04:43:40 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    
    Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
    Average:       dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    
    以下是命令结果的详细说明。
    DEV:表示磁盘的设备名称。
    tps:表示该设备每秒的传输次数,“一次传输”的意思是“一次I/O请求”,多个逻辑请求可能会被合并为“一次I/O请求”,“一次传输”请求的大小是未知的。
    rd_sec/s:表示每秒从设备读取的扇区数。
    wr_sec/s;表示每秒写入设备的扇区数目。
    avgrq-sz:设备平均每次I/O操作的数据大小(扇区)。
    avgqu-sz;平均I/0队列长度。
    await:设备平均每次1VO操作的等待时间(毫秒)。
    svctm:设备平均每次I/O操作的服务时间(毫秒)。
    %util:每秒钟用于I/O操作的百分比。

    11.11 ntsysv:管理开机服务

     
    ntsysv命令提供了一种基于文本界面的菜单操作方式,以设置不同运行级别下的系统服务启动状态。
     
    -back    在交互界面里,显示Back按钮,而非Cancel按钮
    -level    指定运行级别,默认是当前级别
    [root@linuxprobe ~]# ntsysv

     

    10.7 netstat:查看网络状态

    netstat命令

    用于显示本机网络的连接状态、运行端口和路由表等信息。

    netstat命令的参数选项及说明

    -r 显示路由表信息,该功能类似于前面学过的route 和ip route
    -g 显示多播功能群组成员,该功能类似于前面学过的ip maddr
    -i 显示网络接口信息,该功能类似于前面学过的ip -s link
    -s 显示各类协议的统计信息
    -n 显示数字形式的地址而不是去解析主机、端口或用户名。默认情况下,netstat命令会尝试解析并显示主机的主机名,这个过程通常比较长也是非必需的
    -a 显示处于监听状态和非监听状态的socket信息
    -A 显示指定网络类型的网络连接状态
    -c<秒数> 后面跟的秒数表示每隔几秒就刷新显示一次
    -l 仅显示连接状态为“LISTEN”的服务的网络状态
    -t 显示所有的TCP连接情况
    -u 显示所有的UDP连接情况
    -p 显示socket所属进程的PID和名称

    常用选项组合(一)

    [root@cs6 ~]# netstat -an
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address Foreign Address State
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
    tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
    tcp 0 64 10.0.0.100:22 10.0.0.1:2827 ESTABLISHED
    tcp 0 0 10.0.0.100:22 10.0.0.1:6358 ESTABLISHED
    tcp 0 0 :::22 :::* LISTEN
    tcp 0 0 ::1:25 :::* LISTEN
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags Type State I-Node Path
    unix 8 [ ] DGRAM 12335 /dev/log
    unix 2 [ ACC ] STREAM LISTENING 12689 public/cleanup
    unix 2 [ ACC ] STREAM LISTENING 12697 private/tlsmgr
    unix 2 [ ACC ] STREAM LISTENING 12702 private/rewrite
    unix 2 [ ACC ] STREAM LISTENING 12706 private/bounce
    unix 2 [ ACC ] STREAM LISTENING 12710 private/defer
    unix 2 [ ACC ] STREAM LISTENING 12714 private/trace
    unix 2 [ ACC ] STREAM LISTENING 12718 private/verify
    unix 2 [ ACC ] STREAM LISTENING 12722 public/flush
    unix 2 [ ACC ] STREAM LISTENING 12726 private/proxymap

    针对该命令的第一行内容进行了说明。
    第一行活动网络连接说明

    第一列 Proto socket使用的协议(TCP、UDP、RAW)
    第二列 Recv-Q 接收到但是还未处理的字节数
    第三列 Send-Q 已经发送但是未被远程主机确认收到的字节数
    第四列 Local Address 本地主机地址和端口
    第五列 Foreign Address 远程主机地址和端口
    第六列 State socket的状态,通常仅仅有TCP的状态,状态值可有ESTABLISHED、SYN_SENT、SYN_RECV、FIN_WAIT1、FIN_WAIT2、TIME_WAIT等

    第6列 State状态信息详解

    ESTABLISHED socket已经建立连接,表示处于连接的状态,一般认为有一个ESTABLISHED 是一个服务的并发连接。
    该连接状态在生产场景中很重要,需要重点关注
    SYN_SENT socket正在积极尝试建立一个连接,即处于发送后连接前的一个等待但未匹配进入连接的状态
    SYN_RECV 已经从网络上收到一个连接请求
    FIN_WAIT1 socket已关闭,连接正在或正要关闭
    FIN_WAIT2 连接已关闭,并且socket正在等待远端结束
    TIME_WAIT socket正在等待关闭处理仍在网络上的教据包,这个连接状态在生产场景中很重要,需要重点关注
    CLOSED socket不再被占用了
    CLOSE_WAIT 远端已经结束,等待socket关闭
    LAST_ACK 远端已经结束,并且socket也已关闭,等待acknowledgement
    LISTEN socket正在监听连接请求
    CLOSING socket关闭,但是我们仍旧没有发送数据
    UNKNOWN socket状态未知

    常用选项组合(二)

    [root@cs6 ~]# netstat -lntup
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
    tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1358/sshd
    tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1437/master
    tcp        0      0 :::22                       :::*                        LISTEN      1358/sshd
    tcp        0      0 ::1:25                      :::*                        LISTEN      1437/master

    以上命令语句的作用为显示所有TCP和UDP正在监听的连接信息。
    -l:显示所有LISTEN状态的网络连接。
    -n:显示IP地址,不进行DNS解析成主机名、域名。
    -t:显示所有TCP连接。
    -u:显示所有UDP连接。
    -p:显示进程号和进程名。

    显示当前系统的路由表

    [root@cs6 ~]# netstat -rn
    Kernel IP routing table
    Destination Gateway Genmask Flags MSS Window irtt Iface
    10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
    172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
    10.1.0.0 10.0.0.253 255.255.255.0 UG 0 0 0 eth0
    169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
    0.0.0.0 10.0.0.2 0.0.0.0 UG 0 0 0 eth0

    选项-i显示网络的接口状况。

    [root@cs6 ~]# netstat -i
    Kernel Interface table
    Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
    eth0       1500   0     5405      0      0      0     3518      0      0      0 BMRU
    eth1       1500   0        0      0      0      0       18      0      0      0 BMRU
    lo        65536   0        0      0      0      0        0      0      0      0 LRU

    以下是命令结果解释。
    lface:表示网络设备的接口名称。
    MTU:表示最大传输单元,单位为字节。
    RX-OK/TX-OK:表示已经准确无误地接收/发送了多少数据包。
    RX-ERR/TX-ERR:表示接收/发送数据包时产生了多少错误。
    RX-DRP/TX-DRP:表示接收/发送数据包时丢弃了多少数据包。
    RX-OVR/TX-OVR:表示由于误差而遗失了多少数据包。
    Flg:表示接口标记,其中各标记含义具体如下。
    L:表示该接口是个回环设备。
    B:表示设置了广播地址。
    M:表示接收所有数据包。
    R:表示接口正在运行。
    U:表示接口处于活动状态。
    o:表示在该接口上禁用arp。
    P:表示一个点到点的连接。
    正常情况下,RX-ERR/TX-ERR、RX-DRP/TX-DRP和RX-OVR/TX-OVR的值都应该为0,如果这几个选项的值不为0,并且很大,那么网络质量肯定有问题,网络传输性能也一定会下降。

    [root@bzhl ~]# netstat -n|awk '/^tcp/ {++lewen[$NF]} END {for (a in lewen) print a ,lewen[a]}'
    ESTABLISHED 5
    TIME_WAIT 1

    10.8 ss:查看网络状态

    ss命令

      是类似并将取代netstat的工具,它能用来查看网络状态信息,包括TCP、UDP连接、端口等。它的优点是能够显示更多更详细的有关网络连接状态的信息,而且比netstat更快速更高效。
        如果系统没有ss命令,那就需要安装一下,ss命令属于iproute包,因此安装命令是yum -y install iproute。
     
     
    ss [选项] [过滤器]
     
     

    ss命令的参数选项及说明

     
    -n    显示IP地址,不进行DNS解析
    -s    显示socket使用统计
    -r    尝试解析数字IP地址和端口
    -a    显示所有socket连接
    -l    显示所有监听 socket
    -o    显示计时器信息
    -e    显示详细的socket信息
    -m    显示socket的内存使用情况
    -p    显示使用socket的进程
    -i    显示TCP内部信息
     
    -4    仅显示IPv4的socket
    -6    仅显示IPv6的socket
    -0    仅显示PACKET的socket
    -t    仅显示TCP的socket
    -u    仅显示UCP的socket
    -d    仅显示DCCP的socket
    -w    仅显示RAW的socket
    -x    仅显示Unix的socket
     
     

    常用选项组合(一)

    [root@cs6 ~]# ss -an
    State      Recv-Q Send-Q                     Local Address:Port                       Peer Address:Port
    LISTEN     0      128                                   :::22                                   :::*     
    LISTEN     0      128                                    *:22                                    *:*     
    LISTEN     0      100                                  ::1:25                                   :::*     
    LISTEN     0      100                            127.0.0.1:25                                    *:*     
    ESTAB      0      64                            10.0.0.100:22                             10.0.0.1:1821  
    [root@cs6 ~]# ss -an|column -t
    State   Recv-Q  Send-Q  Local          Address:Port   Peer  Address:Port
    LISTEN  0       128     :::22          :::*
    LISTEN  0       128     *:22           *:*
    LISTEN  0       100     ::1:25         :::*
    LISTEN  0       100     127.0.0.1:25   *:*
    ESTAB   0       64      10.0.0.100:22  10.0.0.1:1821
     
     
     

    常用选项组合(二)

    [root@cs6 ~]# ss -lntup|column -t  #<=显示所有正在监听的TCP和UDP连接。
    Netid  State   Recv-Q  Send-Q  Local         Address:Port  Peer                        Address:Port
    tcp    LISTEN  0       128     :::22         :::*          users:(("sshd",1358,4))
    tcp    LISTEN  0       128     *:22          *:*           users:(("sshd",1358,3))
    tcp    LISTEN  0       100     ::1:25        :::*          users:(("master",1437,13))
    tcp    LISTEN  0       100     127.0.0.1:25  *:*           users:(("master",1437,12)) 

    显示socket统计

    [root@bzhl ~]# ss -s
    Total: 318 (kernel 663)
    TCP:   17 (estab 5, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
    
    Transport Total     IP        IPv6
    *      663       -         -        
    RAW      0         0         0        
    UDP      2         1         1        
    TCP      17        14        3        
    INET      19        15        4        
    FRAG      0         0         0        

      

    当服务器产生大量的socket连接时,通常会使用该命令来做宏观数据统计;ss的大部分参数应用和netstat很像,可以参考netstat相关参数的用法。

    10.10 traceroute:追踪数据传输路由状况

    traceroute命令

      用于显示网络数据包传输到指定主机的路径信息,追踪数据传输路由状况。默认数据包大小是60字节(IPv4)或80字节(IPv6),用户可另行设置。它与Windows下的tracert命令类似。
     
    traceroute [option] [host]      [packet len]
    traceroute [选项]   [主机名或IP]  [数据包大小] 

    traceroute命令的参数选项及说明

    -q <nqueries>    设置每一跳的探测包数量。默认是3
    -I               使用ICMP ECHO探测,即ping
    -n               直接使用IP地址而不使用主机名
    -m               设置最大的跳教,默认为30
     
    [root@cs6 ~]# yum install traceroute.x86_64   -y
    [root@cs6 ~]# traceroute www.wenyule.top
    traceroute to www.wenyule.top (213.232.105.22), 30 hops max, 60 byte packets
    #                域名          IP地址              最大30跳(次)  60字节数据包
    1  10.0.0.2 (10.0.0.2)  0.445 ms  0.214 ms  0.348 ms
    # <==第一个同关            第1次时间    第2次    第3次
    2  * * *
    3  * * *
    4  * * *
    5  * * *
    6  * * *
    7  * * *
    8  * * *
    9  * * *
    10  * * *
    11  * * *
    12  * *^C

    命令结果说明具体如下。

        记录按序列号从1开始,每个记录就是一跳,每跳表示一个网关,我们看到每行有3个时间,单位是ms,其实就是-q的默认参数值为3。探测数据包向每个网关发送3个数据包之后,网关响应并返回的时间。
        有时我们traceroute一台主机时,会看到有一些星号。出现这样的情况,可能是因为网络设备封掉或丢弃了返回的信息,所以我们得不到返回的时间。
        有时在某一网关的延时比较长,这有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现了问题,不能解析主机名、域名时,也会有延时比较长的现象,这时可以加-n参数来避免DNS解析,以IP格式输出数据。
        在局域网的不同网段之间,我们可以通过traceroute来排查问题所在,确定是主机的问题还是网关的问题。如果通过远程来访问某台服务器遇到问题时,用traceroute来追踪数据包所经过的网关,并提交给IDC服务商,这样也有助于解决问题。
     

    加快查询时间

    traceroute默认是使用UDP协议(受网络影响性能不太好),因此使用-1参数来调用icmp协议(ping命令使用的协议),若同时还使用-n参数,则不解析主机名:
    [root@cs6 ~]# traceroute -In www.wenyule.top
    traceroute to www.wenyule.top (213.232.105.22), 30 hops max, 60 byte packets
    1  10.0.0.2  0.089 ms  0.056 ms  0.034 ms
    2  * * *
    3  * * *
    4  * * *
    5  * * *
    6  * * *
    7  * * *
    8  * * *
    9  * * *
    10  * * *
    11  * * *
    12  * * *
    13  * * *
    14  * * *
    15  * * *
    16  * * *
    17  * * *
    18  * * *
    19  * * *
    20  * * *
    21  * * *
    22  * * *
    23  * 213.232.105.22  203.477 ms  203.017 ms 
     

    10.11 arping:发送arp请求

    arping命令

      是用于发送arp请求到一个相邻主机的工具,arping使用arp数据包检查局域网内所有设备的硬件地址。 

    arping 命令的参数选项及说明

    -c <次数>        发送指定次数的arp报文后退出命令
    -f              当收到第一个应答报文时,立即退出命令。此选项用于判断目标主机是否存在或者正常运行
    -I 网络接口      指定网络接口发送arp报文
    -w <截止时间>    设置命令的执行裁止时间
    -s source       设定arping发送的arp数据包中的源地址 
     

    测试目的主机是否存活

    [root@cs6 ~]# arping -f 10.0.0.1  #<==使用-f选项收到第一个响应时就退出,用于检测目的主机是否存活。
    ARPING 10.0.0.1 from 10.0.0.100 eth0     #<==从10.0.0.100的eth0网卡向10,0.0.1发送arp报文。
    Unicast reply from 10.0.0.1 [00:50:56:C0:00:08]  0.595ms  <==从10.0.0.1单播回复它的MAC地址,并且显示时是
    Sent 1 probes (1 broadcast(s))     #<=发送1个广播包
    Received 1 response(s)
    [root@cs6 ~]# arping -f 10.0.0.11  #<==没有运行的主机不会响应,命令一直等待,直到Ctr1+C终止。
    ARPING 10.0.0.11 from 10.0.0.100 eth0
    ^CSent 5 probes (5 broadcast(s))
    Received 0 response(s)

     Linux 负载均衡器宕机切换时arp缓存导致故障案例

     
        当Linux负载均衡器发生宕机故障,我们使用备用的设备接管时,因为所有用户以及客户端的arp缓存里对应的仍然是宕机时的负载均衡器的IP,因此,切换完新负载均衡器之后,短时间内用户访问可能依然不正常,此时就需要执行arping命令,让所有的客户端缓存失效,这也是高可用软件的做法:
     
    [root@cs6 ~]# arping -c 1 -I eth0 -s 10.0.0.5 10.0.0.2  #<==这里的10.0.0.5是VIP地址,10.0.0.2是上网网关。
     

    10.13 nc:多功能网络工具

    nc命令

      是一个简单、可靠、强大的网络工具,它可以建立TCP连接,发送UDP数据包,监听任意的TCP和UDP端口,进行端口扫描,处理IPv4和IPv6数据包。
        如果系统没有nc命令,那么可以手动安装,安装命令为yum -y install nc。     

    nc命令的参数选项及说明

    -l    指定监听端口,然后一直等待网络连接
    -z    表示zero,表示扫描时不发送任何数据
    -v    显示详细输出
    -w    设置超时时间,对-l选项失效
    -p    指定nc命令使用的端口,不能和-l选项一起使用,可能引起错误
    -u    使用UDP连接,默认是TCP连接
    -s    指定发送数据的源IP地址,适用于多网卡主机
     
     
    [root@cs6 ~]# /etc/init.d/iptables status
    表格:filter
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination         
    1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
    3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
    5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
     
    Chain FORWARD (policy ACCEPT)
    num  target     prot opt source               destination         
    1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
     
    Chain OUTPUT (policy ACCEPT)
    num  target     prot opt source               destination         
     
    [root@cs6 ~]# /etc/init.d/iptables stop
    iptables:将链设置为政策 ACCEPT:filter                    [确定]
    iptables:清除防火墙规则:                                 [确定]
    iptables:正在卸载模块:                                   [确定]
    [root@cs6 ~]# setenforce 0
    [root@cs6 ~]# getenforce
    Permissive
     

    模拟 TCP 连接并传输文本内容(远程复制文件

    [root@cs6 ~]# nc -l 12345 > lewen.nc  #<=监听12345端口,将数据写入oldboy.nc
    #<=执行完上面的命令后,当前窗口挂起。
    #<=新开一个窗口执行命令。
    [root@cs6 ~]# cat lewen.nc  #<=首先查看12345端口。
    [root@cs6 ~]# netstat -lntup|grep 12345
    tcp        0      0 0.0.0.0:12345               0.0.0.0:*                   LISTEN      2612/nc             
    [root@cs6 ~]# cat lewen.log #<=待用的文件。
    6.8.0  #<=文件中的内容
    [root@cs6 ~]# nc 10.0.0.100 12345 < lewen.log  #<=使用nc命令向10.0.0.100 主机12345 端口传输lewen.log文件
    [root@cs6 ~]# netstat -lntup|grep 12345  #<==nc命令传输完数据后自动终止。
    [root@cs6 ~]# cat lewen.nc  #检查结果
    6.8.0 

    用Shell 模拟一个简单的Web 服务器效果案例

    [root@cs6 ~]# echo "I love linux www.wenyule.top" >test.txt
    [root@cs6 ~]# vim web.sh
    #!/bin/bash
    while true
      do
        nc -l 80 < test.txt # 一直监听80端口,test.txt是发送给用户的内容。
    done
     
    [root@cs6 ~]# sh web.sh &>/dev/null &
    [1] 2685
    [root@cs6 ~]#
     
    [root@cs6 ~]# netstat -lntup|grep 80
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      2686/nc             
    [root@cs6 ~]# curl 127.0.0.1
    I love linux www.wenyule.top 

    手动与HTTP服务器建立连接的例子。

    [root@cs6 ~]# nc blog.oldboyedu.com 80
    GET /about-us/ HTTP/1.1  <=粘贴这两行语句,速度要快,如果慢了程序就会超时自动退出。
    host:blog.oldboyedu.com   <==HTTP/1.1的要求必须写明hosto
    #<==敲两次回车确认发送请求报文,下面就是响应报文的内容。
    HTTP/1.1 301 Moved Permanently
    Server: nginx
    Date: Tue, 07 May 2019 13:40:50 GMT
    Content-Type: text/html
    Content-Length: 178
    Connection: keep-alive
    Location: https://blog.oldboyedu.com/about-us/
     
    <html>
    <head><title>301 Moved Permanently</title></head>
    <body bgcolor="white">
    <center><h1>301 Moved Permanently</h1></center>
    <hr><center>nginx</center>
    </body>
    </html>

    利用nc 进行端口扫描

    [root@cs6 ~]# nc -z 10.0.0.100 20-30
    Connection to 10.0.0.100 22 port [tcp/ssh] succeeded!
    [root@cs6 ~]# nc -z 10.0.0.100 22
    Connection to 10.0.0.100 22 port [tcp/ssh] succeeded!
    [root@cs6 ~]# nc -zv 10.0.0.100 20-30  #<=使用-v选项详细显示扫描过程
    nc: connect to 10.0.0.100 port 20 (tcp) failed: Connection refused
    nc: connect to 10.0.0.100 port 21 (tcp) failed: Connection refused
    Connection to 10.0.0.100 22 port [tcp/ssh] succeeded!
    nc: connect to 10.0.0.100 port 23 (tcp) failed: Connection refused
    nc: connect to 10.0.0.100 port 24 (tcp) failed: Connection refused
    nc: connect to 10.0.0.100 port 25 (tcp) failed: Connection refused
    nc: connect to 10.0.0.100 port 26 (tcp) failed: Connection refused
    nc: connect to 10.0.0.100 port 27 (tcp) failed: Connection refused
    nc: connect to 10.0.0.100 port 28 (tcp) failed: Connection refused
    nc: connect to 10.0.0.100 port 29 (tcp) failed: Connection refused
    nc: connect to 10.0.0.100 port 30 (tcp) failed: Connection refused 

     使用nc命令,模拟QQ聊天工具聊天

    打开两个命令行窗口,模拟两个人聊天的场景。
    首先在第一个窗口执行如下命令,执行完会hang住等待输入状态:
    [root@cs6 ~]# nc -l 12345
     
    然后在第2个窗口执行如下命令,执行完也会hang住等待输入状态:
    [root@cs6 ~]# nc 127.0.0.1 12345
     
    此时两个窗口都等待输入内容。我们先新建第3个窗口,查看他们建立的网络连接:
     
    [root@cs6 ~]# netstat -ntp|grep nc #<=12345端口是nc指定开放的,52978端口是系统为了和12345就口通信随机开放的,当然也可以使用-p选项指定开放端口。
    tcp        0      0 127.0.0.1:12345             127.0.0.1:37060             ESTABLISHED 2748/nc             
    tcp        0      0 127.0.0.1:37060             127.0.0.1:12345             ESTABLISHED 2749/nc   
     
    怎么聊天呢?很简单,你在第一个窗口中输入想要说的话,然后敲回车键,悄悄话就会自动发送到对方(第二个窗口),和QQ的效果一样:
     
    [root@cs6 ~]# nc -l 12345
    hi,I am lewen
     
    对方(第二个窗口)也只需要输入回复的话然后敲回车键,消息就能发送给你:
    [root@cs6 ~]# nc 127.0.0.1 12345
    hi,I am lewen
    hello,lewen
     

    10.18 nslookup:域名查询工具

    功能说明

    nslookup命令是常用的域名解析查询工具。
    如果系统没有nslookup命令,则需要安装下面的软件包:
    yum -y install bind-utils
     

    语法格式

    nslookup [option] [name] [server] 
    nalookup [选填]   [域名/IP]  [DNS服务器]
     

    【选项说明】

    nslookup有如下两种模式。
        交互模式:用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。
        非交互模式:针对一个主机或域名仅仅获取特定的名称或所需的信息。
    先来看看如何进入交互模式。
        直接输入nslookup命令,若不加任何参数,则会直接进入交互模式,此时nslookup会连接到默认的域名服务器(即/etc/resolv.conf的第一个DNS地址)。
    交互模式也支持选定不同的域名服务器。只需要将第一个参数设置为“-”,然后第二个参数是设置要连接的域名服务器主机名或IP地址。
     
     
    表10-18  交互模式下nslookup命令的参数选项及说明
    参数选项            解释说明
    exit               退出nslookup命令
    server <城名服务器>  指定解析域名的服务器地址
    set关键字=值        设置查询关键字(城名属性)的值。常见的关键字如下:
                        all(全部)查询城名有关的所有信息
                        domain=name 指定查询的城名
                        port=端口号 指定裁名服务器使用的端口号
                        type=类型名 指定域名查询的类型(例如,A、HINFO、PTR、NS、MX等)
                        retry=<次数>指定查询时重试的次数
                        timeout=秒数指定查询的超时时间
     
     
    对于非交互模式,可采用以下方式进入。
    直接在nslookup命令后加上所要查询的IP或主机名,即可进入非交互模式,也可以在第二个参数位置设置所要连接的域名服务器。
     
    表10-19 非交互模式下nslookup命令的参数选项及说明参数选项解释说明
    -timeout        指定查询的超时时间
    -query           指定域名查询的类型
     

    使用范例

    交互模式

    [root@k8s-node1 ~]# nslookup
    > www.wenyule.top           # 符号“>”是nslookup命令的提示。在此提示符下输入要查询的城名信息进行查询。
    Server:        10.0.0.2     # 默认DNS服务器。
    Address:    10.0.0.2#53     #上面的DNS服务器的IP地址与端口号。
     
    Non-authoritative answer:   # 非授权域名服务器的应答,说明本域名服务器给出的城名解析信息是从其他域名服务器那里查询所得到的信息,而非自己管理的域。
    Name:    www.wenyule.top
    Address: 66.154.120.110     #<显示城名对应的IP地址。
     
    > server 223.5.5.5        #指定解析域名的服务器地址,这个是阿里云的公共DNS服务器
    Default server: 223.5.5.5
    Address: 223.5.5.5#53
     
    > wenyule.top            #输入待解析的域名
    Server:        223.5.5.5
    Address:    223.5.5.5#53
     
    Non-authoritative answer:
    Name:    wenyule.top
    Address: 66.154.120.110
    >
     
    > set type=ANY      #查询域名有关的所有信息:
    > www.baidu.com
    Server:        223.5.5.5
    Address:    223.5.5.5#53
     
    Non-authoritative answer:
    www.baidu.com    canonical name = www.a.shifen.com.
     
    Authoritative answers can be found from:
     
    > set type=MX         # 查询邮件MX记录:
    > baidu.com
    Server:        223.6.6.6
    Address:    223.6.6.6#53
     
    Non-authoritative answer:
    baidu.com    mail exchanger = 10 mx.maillb.baidu.com.
    baidu.com    mail exchanger = 20 mx50.baidu.com.
    baidu.com    mail exchanger = 20 jpmx.baidu.com.
    baidu.com    mail exchanger = 15 mx.n.shifen.com.
    baidu.com    mail exchanger = 20 mx1.baidu.com.
     
     
    可以直接在命令行指定解析域名的服务器地址,但是要注意写法,不要少了“-”:
    [root@k8s-node1 ~]#  nslookup - 223.5.5.5
    > baidu.com
    Server:        223.5.5.5
    Address:    223.5.5.5#53
     
    Non-authoritative answer:
    Name:    baidu.com
    Address: 123.125.114.144
    Name:    baidu.com
    Address: 220.181.57.216

    非交互查模式

    采用非交互查模式,指定域名服务器地址,查询www.oldboyedu.com对应的域名记录:
     
    [root@k8s-node1 ~]# nslookup baidu.com 223.5.5.5
    Server:        223.5.5.5
    Address:    223.5.5.5#53
     
    Non-authoritative answer:
    Name:    baidu.com
    Address: 123.125.114.144
    Name:    baidu.com
    Address: 220.181.57.216

    10.19 dig:域名查询工具

    dig命令

    是常用的域名查询工具,可以用于测试域名系统的工作是否正常。 

    dig命令的参数选项及说明

    @<DNS服务器地址>    指定进行城名解析的域名服务器。当不希望使用本机默认的DNS服务器设置时,使用此选项可指定进行线名解析的其他的域名服务器
     
    -x             反向域名解析    
    -t             指定要查询的DNS数据类型,如A、MX和PTR等。默认的查询类型为A
    -b             指定使用本机的哪个IP地址向域名服务器发送域名查询请求
    -P             指定域名服务器所使用的端口号。默认情况下,域名服务器使用UDP协议的53端口
    +trace         从根域开始跟踪查询结果
    +nocmd         不输出dig的版本信息
    +short         仅输出最精简的CNAME信息和A记录,其他的都不会输出
    +nocomment     不输出dig的详情注释信息
    +nostat        不输出最后的统计信息
     

    查询指定域名的IP地址 

    [root@cs6 ~]# dig www.wenyule.top
     
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.1 <<>> www.wenyule.top
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52108
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 18
     
    ;; QUESTION SECTION:
    ;www.wenyule.top.        IN    A
     
    ;; ANSWER SECTION:
    www.wenyule.top.    5    IN    A    213.232.105.22  #<=查询结果。
     
    ;; AUTHORITY SECTION:
    wenyule.top.        5    IN    NS    dns18.hichina.com.
    wenyule.top.        5    IN    NS    dns17.hichina.com.
     
    ;; ADDITIONAL SECTION:
    dns17.hichina.com.    5    IN    A    140.205.41.27
    dns17.hichina.com.    5    IN    A    140.205.81.17
    dns17.hichina.com.    5    IN    A    140.205.81.27
    dns17.hichina.com.    5    IN    A    106.11.141.117
    dns17.hichina.com.    5    IN    A    106.11.141.127
    dns17.hichina.com.    5    IN    A    106.11.211.57
    dns17.hichina.com.    5    IN    A    106.11.211.67
    dns17.hichina.com.    5    IN    A    140.205.41.17
    dns18.hichina.com.    5    IN    A    106.11.211.68
    dns18.hichina.com.    5    IN    A    140.205.41.18
    dns18.hichina.com.    5    IN    A    140.205.41.28
    dns18.hichina.com.    5    IN    A    140.205.81.18
    dns18.hichina.com.    5    IN    A    140.205.81.28
    dns18.hichina.com.    5    IN    A    106.11.141.118
    dns18.hichina.com.    5    IN    A    106.11.141.128
    dns18.hichina.com.    5    IN    A    106.11.211.58
    dns17.hichina.com.    5    IN    AAAA    2400:3200:2000:36::1
    dns18.hichina.com.    5    IN    AAAA    2400:3200:2000:37::1
     
    ;; Query time: 56 msec              #<=查询时间。
    ;; SERVER: 10.0.0.2#53(10.0.0.2)    #<=使用默认的DNS服务器。
    ;; WHEN: Tue May  7 14:35:44 2019
    ;; MSG SIZE  rcvd: 412   
     

    反向域名解析例子

    完整的域名解析包括正向解析(即范例10-67,将域名解析成IP地址)和反向解析(给定IP地址查询其对应的域名信息)。
    [root@cs6 ~]# dig -x 213.232.105.22
     
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.1 <<>> -x 213.232.105.22
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 45496
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
     
    ;; QUESTION SECTION:
    ;22.105.232.213.in-addr.arpa.    IN    PTR
     
    ;; AUTHORITY SECTION:
    213.in-addr.arpa.    5    IN    SOA    pri.authdns.ripe.net. dns.ripe.net. 1557371861 3600 600 864000 3600
     
    ;; Query time: 124 msec
    ;; SERVER: 10.0.0.2#53(10.0.0.2)
    ;; WHEN: Tue May  7 14:40:42 2019
    ;; MSG SIZE  rcvd: 105
     

    查询MX类型的域名信息 

     [root@cs6 ~]# dig -t MX oldboyedu.com #<=使用-t 选项选择查询的类型
     
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.1 <<>> -t MX oldboyedu.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 13697
    ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
    ;; WARNING: recursion requested but not available
     
    ;; QUESTION SECTION:
    ;oldboyedu.com.            IN    MX
     
    ;; Query time: 5 msec
    ;; SERVER: 10.0.0.2#53(10.0.0.2)
    ;; WHEN: Tue May  7 14:42:57 2019
    ;; MSG SIZE  rcvd: 31
     
     

    显示完整的DNS解析过程

    [root@cs6 ~]# dig @223.5.5.5 www.wenyule.top +trace
     
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.1 <<>> @223.5.5.5 www.wenyule.top +trace
    ; (1 server found)
    ;; global options: +cmd
    .            195170    IN    NS    g.root-servers.net.
    .            195170    IN    NS    j.root-servers.net.
    .            195170    IN    NS    c.root-servers.net.
    .            195170    IN    NS    f.root-servers.net.
    .            195170    IN    NS    m.root-servers.net.
    .            195170    IN    NS    i.root-servers.net.
    .            195170    IN    NS    d.root-servers.net.
    .            195170    IN    NS    e.root-servers.net.
    .            195170    IN    NS    a.root-servers.net.
    .            195170    IN    NS    b.root-servers.net.
    .            195170    IN    NS    h.root-servers.net.
    .            195170    IN    NS    k.root-servers.net.
    .            195170    IN    NS    l.root-servers.net.    #<=显示全球13个根服务器a-m
    ;; Received 228 bytes from 223.5.5.5#53(223.5.5.5) in 127 ms
     
    top.            172800    IN    NS    a.zdnscloud.com.
    top.            172800    IN    NS    b.zdnscloud.com.
    top.            172800    IN    NS    c.zdnscloud.com.
    top.            172800    IN    NS    d.zdnscloud.com.
    top.            172800    IN    NS    f.zdnscloud.com.
    top.            172800    IN    NS    g.zdnscloud.com.
    top.            172800    IN    NS    i.zdnscloud.com.
    top.            172800    IN    NS    j.zdnscloud.com.
    ;; Received 326 bytes from 192.5.5.241#53(192.5.5.241) in 104 ms
     
    wenyule.top.        3600    IN    NS    dns17.hichina.com.
    wenyule.top.        3600    IN    NS    dns18.hichina.com.
    ;; Received 84 bytes from 203.99.27.1#53(203.99.27.1) in 43 ms
     
    www.wenyule.top.    600    IN    A    213.232.105.22
    ;; Received 49 bytes from 106.11.141.128#53(106.11.141.128) in 59 ms 
     

    精简输出例子

    [root@cs6 ~]# dig +nocmd +nocomment +nostat www.wenyule.top
    ;www.wenyule.top.        IN    A
    www.wenyule.top.    5    IN    A    213.232.105.22
    top.            5    IN    NS    f.zdnscloud.com.
    top.            5    IN    NS    g.zdnscloud.com.
    top.            5    IN    NS    b.zdnscloud.com.
    top.            5    IN    NS    i.zdnscloud.com.
    top.            5    IN    NS    d.zdnscloud.com.
    top.            5    IN    NS    j.zdnscloud.com.
    top.            5    IN    NS    a.zdnscloud.com.
    top.            5    IN    NS    c.zdnscloud.com.
    b.zdnscloud.com.    5    IN    A    203.99.25.1
    d.zdnscloud.com.    5    IN    A    203.99.27.1
    f.zdnscloud.com.    5    IN    A    114.67.46.12
    g.zdnscloud.com.    5    IN    A    42.62.2.16
    i.zdnscloud.com.    5    IN    AAAA    2401:8d00:1::1
    j.zdnscloud.com.    5    IN    AAAA    2401:8d00:2::1
     
    [root@cs6 ~]# dig +short www.wenyule.top
    213.232.105.22

    10.20 host:域名查询工具

    host命令

    是用于查询DNS的工具,它可以将指定主机名称转换为IP地址。

    host命令的参数选项及说明


    -a 显示详细的DNS信息
    -t 指定查询的域名信息类型,可以是“A”、“ALL”、“MX”和“NS”等

    DNS查询


    [root@cs6 ~]# host www.wenyule.top
    www.wenyule.top has address 213.232.105.22

    查询详细信息

    [root@cs6 ~]# host -a www.wenyule.top
    Trying "www.wenyule.top"
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53480
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 18
    
    ;; QUESTION SECTION:
    ;www.wenyule.top. IN ANY
    
    ;; ANSWER SECTION:
    www.wenyule.top. 5 IN A 213.232.105.22
    
    ;; AUTHORITY SECTION:
    wenyule.top. 5 IN NS dns17.hichina.com.
    wenyule.top. 5 IN NS dns18.hichina.com.
    
    ;; ADDITIONAL SECTION:
    dns17.hichina.com. 5 IN A 140.205.81.17
    dns17.hichina.com. 5 IN A 140.205.81.27
    dns17.hichina.com. 5 IN A 106.11.141.117
    dns17.hichina.com. 5 IN A 106.11.141.127
    dns17.hichina.com. 5 IN A 106.11.211.57
    dns17.hichina.com. 5 IN A 106.11.211.67
    dns17.hichina.com. 5 IN A 140.205.41.17
    dns17.hichina.com. 5 IN A 140.205.41.27
    dns17.hichina.com. 5 IN AAAA 2400:3200:2000:36::1
    dns18.hichina.com. 5 IN A 106.11.211.68
    dns18.hichina.com. 5 IN A 140.205.41.18
    dns18.hichina.com. 5 IN A 140.205.41.28
    dns18.hichina.com. 5 IN A 140.205.81.18
    dns18.hichina.com. 5 IN A 140.205.81.28
    dns18.hichina.com. 5 IN A 106.11.141.118
    dns18.hichina.com. 5 IN A 106.11.141.128
    dns18.hichina.com. 5 IN A 106.11.211.58
    dns18.hichina.com. 5 IN AAAA 2400:3200:2000:37::1
    
    Received 412 bytes from 10.0.0.2#53 in 31 ms
    
    

    指定DNS服务器查询

    [root@cs6 ~]# host -a www.wenyule.top 8.8.8.8
    Trying "www.wenyule.top"
    Using domain server:
    Name: 8.8.8.8
    Address: 8.8.8.8#53
    Aliases:
    
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20333
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 8, ADDITIONAL: 8
    
    ;; QUESTION SECTION:
    ;www.wenyule.top. IN ANY
    
    ;; ANSWER SECTION:
    www.wenyule.top. 600 IN A 213.232.105.22
    
    ;; AUTHORITY SECTION:
    top. 48532 IN NS j.zdnscloud.com.
    top. 48532 IN NS a.zdnscloud.com.
    top. 48532 IN NS d.zdnscloud.com.
    top. 48532 IN NS g.zdnscloud.com.
    top. 48532 IN NS c.zdnscloud.com.
    top. 48532 IN NS f.zdnscloud.com.
    top. 48532 IN NS i.zdnscloud.com.
    top. 48532 IN NS b.zdnscloud.com.
    
    ;; ADDITIONAL SECTION:
    a.zdnscloud.com. 703 IN A 203.99.24.1
    b.zdnscloud.com. 2433 IN A 203.99.25.1
    c.zdnscloud.com. 2366 IN A 203.99.26.1
    d.zdnscloud.com. 769 IN A 203.99.27.1
    f.zdnscloud.com. 2145 IN A 114.67.46.12
    g.zdnscloud.com. 1039 IN A 42.62.2.16
    i.zdnscloud.com. 175 IN AAAA 2401:8d00:1::1
    j.zdnscloud.com. 1278 IN AAAA 2401:8d00:2::1
    
    Received 342 bytes from 8.8.8.8#53 in 56 ms
    
    

    按类进行查询

    [root@cs6 ~]# host -t MX wenyule.top
    wenyule.top mail is handled by 5 mxn.mxhichina.com.
    wenyule.top mail is handled by 10 mxw.mxhichina.com.

    10.21 nmap:网络探测工具和安全/端口扫描器

    nmap命令

      是一款开放源代码的网络探测和安全审核工具,是Network Mapper的缩写。其设计目标是快速地扫描大型网络。nmap可以发现网络上有哪些主机,主机提供了什么服务(应用程序名称和版本号),并探测操作系统的类型及版本信息。
    如果系统没有nmap命令,则可以使用下面的命令来安装:
     
      nmap [Scan Type] [option] (target specification) 
     
    扫描目标可以为IP地址、子网地址等,如192.168.1.2或10.0.0.0/24。
     
     

    nmap命令的参数选项及说明

     
    -sS    TCP同步扫描(TCP SYN)
    -ST    TCP连接扫描
    -sn    不进行端口扫描,只检查主机正在运行。该选项与老版本的-sP相同
    -sU    扫描UDP端口
    -sV    探测服务版本信息
    -Pn    只进行扫描,不ping主机
    -PS    使用SYN包对目标主机进行扫描。默认是80端口,也可以指定端口,格式为-PS22或-PS22-25,80,113,1050,35000,记住PS和端口号之间不要有空格
    -PU    使用udp ping扫描端口
    -O     激活对TCP/IP指纹特征(fingerprinting)的扫描,获得远程主机的标志,也就是操作系统类型
    -V     显示扫描过程中的详细信息*
    -S<IP>          设置扫描的源IP地址
    -g port         设置扫描的源端口
    -oN             把扫描的结果重定向到文件中
    -iL filename    从文件中读取扫描的目标
    -p<端口>        指定要扫描的端口,可以是一个单独的端口,也可以用逗号分隔开多个端口,或者使用“-”表示端口范围
    -n              不进行DNS解析,加快扫描速度
    -exclude        排除指定主机
    -excludefile    排除指定文件中的主机
     
     

    查看主机当前开放的端口

    [root@cs6 ~]# nmap 10.0.0.100
     
    Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-07 16:49 CST
    Nmap scan report for 10.0.0.100
    Host is up (0.0000040s latency).
    Not shown: 998 closed ports
    PORT   STATE SERVICE
    22/tcp open  ssh
    80/tcp open  http
     
    Nmap done: 1 IP address (1 host up) scanned in 6.83 seconds

    扫描主机的指定端口

    [root@cs6 ~]# nmap -p 1024-65535 10.0.0.100
     
    Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-07 17:01 CST
    Nmap scan report for 10.0.0.100
    Host is up (0.0000040s latency).
    All 64512 scanned ports on 10.0.0.100 are closed
     
    Nmap done: 1 IP address (1 host up) scanned in 7.18 seconds

    扫描局域网内所有的IP

    [root@cs6 ~]# nmap 10.0.0.0/24
     
    Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-07 17:02 CST
    Nmap scan report for 10.0.0.1
    Host is up (0.00023s latency).
    Not shown: 999 filtered ports
    PORT     STATE SERVICE
    3306/tcp open  mysql
    MAC Address: 00:50:56:C0:00:08 (VMware)
     
    Nmap scan report for 10.0.0.2
    Host is up (0.00013s latency).
    Not shown: 999 closed ports
    PORT   STATE    SERVICE
    53/tcp filtered domain
    MAC Address: 00:50:56:F4:FB:52 (VMware)
     
    Nmap scan report for 10.0.0.100
    Host is up (0.0000040s latency).
    Not shown: 998 closed ports
    PORT   STATE SERVICE
    22/tcp open  ssh
    80/tcp open  http
     
    Nmap done: 256 IP addresses (3 hosts up) scanned in 25.94 seconds
    [root@cs6 ~]# nmap -sn 10.0.0.0/24 #<==使用-sn选项不扫描端口。
     
    Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-07 17:03 CST
    Nmap scan report for 10.0.0.1
    Host is up (0.000089s latency).
    MAC Address: 00:50:56:C0:00:08 (VMware)
    Nmap scan report for 10.0.0.2
    Host is up (0.00013s latency).
    MAC Address: 00:50:56:F4:FB:52 (VMware)
    Nmap scan report for 10.0.0.100
    Host is up.
    Nmap done: 256 IP addresses (3 hosts up) scanned in 21.05 seconds
     
     
    [root@cs6 ~]# nmap -sn 10.0.0.1-10 #<=可以使用这种地进范围进行扫描。
    Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-07 17:04 CST
    Nmap scan report for 10.0.0.1
    Host is up (0.000034s latency).
    MAC Address: 00:50:56:C0:00:08 (VMware)
    Nmap scan report for 10.0.0.2
    Host is up (0.00015s latency).
    MAC Address: 00:50:56:F4:FB:52 (VMware)
    Nmap done: 10 IP addresses (2 hosts up) scanned in 6.77 seconds

    探测目标主机的服务和操作系统的版本

    [root@cs6 ~]# nmap -O -sV 10.0.0.100
     
    Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-07 17:05 CST
    Nmap scan report for 10.0.0.100
    Host is up (0.000090s latency).
    Not shown: 998 closed ports
    PORT   STATE SERVICE VERSION
    22/tcp open  ssh     OpenSSH 5.3 (protocol 2.0)
    80/tcp open  http?
    1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at http://www.insecure.org/cgi-bin/servicefp-submit.cgi :
    SF-Port80-TCP:V=5.51%I=7%D=5/7%Time=5CD14A57%P=x86_64-redhat-linux-gnu%r(N
    SF:ULL,1D,"Ix20lovex20linuxx20www.wenyule.top
    ");
    No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ).
    TCP/IP fingerprint:
    OS:SCAN(V=5.51%D=5/7%OT=22%CT=1%CU=35109%PV=Y%DS=0%DC=L%G=Y%TM=5CD14A63%P=x
    OS:86_64-redhat-linux-gnu)SEQ(SP=106%GCD=1%ISR=109%TI=Z%CI=Z%II=I%TS=A)OPS(
    OS:O1=MFFD7ST11NW7%O2=MFFD7ST11NW7%O3=MFFD7NNT11NW7%O4=MFFD7ST11NW7%O5=MFFD
    OS:7ST11NW7%O6=MFFD7ST11)WIN(W1=FFCB%W2=FFCB%W3=FFCB%W4=FFCB%W5=FFCB%W6=FFC
    OS:B)ECN(R=Y%DF=Y%T=40%W=FFD7%O=MFFD7NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=
    OS:S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q
    OS:=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A
    OS:%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y
    OS:%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T
    OS:=40%CD=S)
    #<= -O 显示系统版本,但是nmap命令是根据探测的TCP/IP指纹与自己的指纹库进行对比的。如果不在指纹库之内的系统就会无法识别。
    Network Distance: 0 hops
     
    OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
    Nmap done: 1 IP address (1 host up) scanned in 18.61 seconds

         上面的输出信息中不仅包含了端口号,而且还包括了服务的版本号。在网络安全性要求较高的主机上,最好能够屏蔽服务版本号,以防止黑客利用特定版本的服务漏洞进行攻击。

     

    10.22 tcpdump:监听网络流量

    【功能说明】

    tcpdump命令是一个截获网络数据包的包分析工具。tcpdump可以将网络中传送的数据包的“头”完全截获下来以提供分析。它支持针对网络层、协议、主机、端口等的过滤,并支持与、或、非逻辑语句协助过滤有效信息。
    tcpdump命令工作时要先把网卡的工作模式切换到混杂模式(promiscuous mode)。因为要修改网络接口的工作模式,所以tcpdump命令需要以root的身份运行。

    【语法格式】

    tcpdump [option] [expression] 
    tcpdump [选项]    [表达式]
     
    表10-23 tcpdump 命令的参数选项及说明
    参数选项            解释说明
    -A                   以ASCII码的方式显示每一个数据包(不会显示数据包中链路层的头部信息)。在抓取包含网页数据的数据包时,可方便查看数据
    -c<数据包数目>        接收到指定的数据包数目后退出命令
    -e                   每行的打印输出中将包括数据包的数据链路层头部信息
    -i<网络接口>         指定要监听数据包的网络接口
     
    -n                  不进行DNS解析,加快显示速度
    -nn                 不将协议和端口数字等转换成名字
    -q                  以快速输出的方式运行,此选项仅显示数据包的协议概要信息,输出信息较短
    -s<教据包大小>       设置数据包抓取长度,如果不设置则默认为68等节,设置为0则自动选择合适的长度来抓取数据包
    -t                  在每行输出信息中不显示时间截标记
    -tt                 在每行输出信息中显示无格式的时间载标记
    -ttt                显示当前行与前一行的延迟
    -tttt               在每行打印的时间戳之前添加日期
    -ttttt              显示当前行与第一行的延迟
    -v                  显示命令执行的详细信息
    -vv                 显示比-v选项更加详细的信息
    -vvv                显示比-vv选项更加详细的输出
     

    使用范例

    不加参数运行tcpdump命令监听网络。

    [root@lewen ~]# tcpdump    #默认清况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    ...
     
    使用tcpdump命令时,如果不输入过滤规则,则输出的数据量将会很大。 
     
    精简输出信息。
     
    [root@lewen ~]# tcpdump -q
    04:08:32.963134 IP lewen.ssh > 10.0.0.1.10662: tcp 180
    04:08:32.963256 IP lewen.ssh > 10.0.0.1.10662: tcp 116
    04:08:32.963325 IP 10.0.0.1.10662 > lewen.ssh: tcp 0
    04:08:32.963390 IP lewen.ssh > 10.0.0.1.10662: tcp 180
    04:08:32.963492 IP lewen.ssh > 10.0.0.1.10662: tcp 116
    04:08:32.964604 IP lewen.ssh > 10.0.0.1.10662: tcp 116
     
     
    [root@lewen ~]# tcpdump -c 5  #使用-c选项指定监听的数据包数量,这样就不需要使用Ctrl+C了。
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    04:09:50.191752 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 3827665832:3827666044, ack 1911166938, win 274, length 212
    04:09:50.192434 IP lewen.44182 > public1.alidns.com.domain: 5716+ PTR? 1.0.0.10.in-addr.arpa. (39)
    04:09:50.245211 IP 10.0.0.1.10662 > lewen.ssh: Flags [.], ack 212, win 8212, length 0
    04:09:50.257155 IP public1.alidns.com.domain > lewen.44182: 5716 NXDomain 0/1/0 (116)
    04:09:50.258230 IP lewen.36787 > public1.alidns.com.domain: 45732+ PTR? 81.0.0.10.in-addr.arpa. (40)
    5 packets captured
    21 packets received by filter
    0 packets dropped by kernel

    监听指定网卡收到的数据包

    [root@lewen ~]# tcpdump -i eth0
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    04:11:33.924611 IP 10.0.0.1.10662 > lewen.ssh: Flags [.], ack 651624, win 8209, length 0
    04:11:33.924679 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 651624:651884, ack 105, win 274, length 260
    04:11:33.924776 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 651884:652048, ack 105, win 274, length 164
    04:11:33.924834 IP 10.0.0.1.10662 > lewen.ssh: Flags [.], ack 652048, win 8207, length 0
    04:11:33.924901 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 652048:652308, ack 105, win 274, length 260
    04:11:33.929182 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 652308:652472, ack 105, win 274, length 164
    04:11:33.931108 IP 10.0.0.1.10662 > lewen.ssh: Flags [.], ack 652472, win 8212, length 0
    04:11:33.931140 IP lewen.ssh > 10.0.0.1.10662: Flags [P.], seq 652472:652636, ack 105, win 274, length 164
     
     
    04:11:33.931140:当前时间,精确到微秒。
    IP lewen.ssh > 10.0.0.1.10662:从主机lewen的SSH端口发送数据到10.0.0.1的10662端口,“>”代表数据流向。
    Flags[P.]:TCP包中的标志信息,S是SYN标志的缩写,F(FIN)、P(PUSH)、R(RST)、"."(没有标记)。
    seq:数据包中的数据的顺序号。
    ack:下次期望的顺序号。
    win:接收缓存的窗口大小。
    length:数据包长度。

    监听指定主机的数据包

    [root@lewen ~]# tcpdump -n host 10.0.0.1    #<=使用-n选项不进行DNS解析,加快显示地度。监听指定主机的关键字为host,后面直接接主机名或了IP地址即可。本行命令的作用是监听所有10.0.0.1的主机收到的和发出的数据包。
     
    [root@lewen ~]# tcpdump -n src host 10.0.0.1    #<-只监听从10.0.0.1发出的数据包,即源地址为10.0.0.1,关键字为src(source,原地址)。
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    20:20:55.821984 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 3862927143, win 4106, length 0
    20:20:55.866408 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 149, win 4105, length 0
    20:20:55.907580 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 297, win 4105, length 0
    20:20:55.950705 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 445, win 4104, length 0
    20:20:55.991940 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 593, win 4103, length 0
    20:20:56.032129 IP 10.0.0.1.14389 > 10.0.0.7.ssh: Flags [.], ack 741, win 4103, length 0
    
       
    [root@lewen ~]# tcpdump -n dst host 10.0.0.1    #<==只监听10.0.0.1收到的数据包,即目标地址为10.0.0.1,关就字为dst(destination,目的地)。
    20:22:13.074240 IP 10.0.0.7.ssh > 10.0.0.1.14389: Flags [P.], seq 506496:506660, ack 53, win 252, length 164
    20:22:13.074331 IP 10.0.0.7.ssh > 10.0.0.1.14389: Flags [P.], seq 506660:506824, ack 53, win 252, length 164

    监听指定端口的数据包

    [root@lewen ~]# tcpdump -nn port 22       #使用-n选项不进行DNS解析,但是其会将一些协议、端口进行转换,比如22端口转为ssh。因此本例使用nn 选项。监听指定端口的关键字是port,后面接上端口号即可
     
    20:24:26.193100 IP 10.0.0.1.14389 > 10.0.0.7.22: Flags [.], ack 556296, win 4101, length 0
    20:24:26.193225 IP 10.0.0.7.22 > 10.0.0.1.14389: Flags [P.], seq 556296:556556, ack 105, win 252, length 260
    20:24:26.193535 IP 10.0.0.7.22 > 10.0.0.1.14389: Flags [P.], seq 556556:556720, ack 105, win 252, length 164

    监听指定协议的数据包。

     
    [root@lewen ~]# tcpdump -n arp      #<--监听ARP数据包,因此表达式直接写arp即可。
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    20:26:43.219758 ARP, Request who-has 10.0.0.96 tell 10.0.0.210, length 46
    20:26:43.511133 ARP, Request who-has 10.0.0.95 tell 10.0.0.210, length 46
    20:26:44.224050 ARP, Request who-has 10.0.0.96 tell 10.0.0.210, length 46
    20:26:44.512986 ARP, Request who-has 10.0.0.95 tell 10.0.0.210, length 46
    20:26:45.230012 ARP, Request who-has 10.0.0.96 tell 10.0.0.210, length 46
     
     
    [root@lewen ~]# tcpdump -n icmp     #<-监听icmp数据包(想要查着下面的监拉数据,可以使用其他机器ping本机即可)
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    20:27:31.377258 IP 10.0.0.210 > 10.0.0.2: ICMP 10.0.0.210 udp port 49207 unreachable, length 127
    20:27:31.479590 IP 10.0.0.210 > 10.0.0.2: ICMP 10.0.0.210 udp port 48776 unreachable, length 135
     
    常见的协议关键字有ip、arp、icmp、tcp、udp等类型。 

     多个过滤条件混合使用

    前面的几种方法都是使用单个过滤条件过滤数据包,其实过滤条件可以混合使用,因为tcpdump命令支持逻辑运算符and(与)、or(或)、!(非)。
     
    [root@lewen ~]# tcpdump -n ip host 10.0.0.7 and ! 10.0.0.1    #<==获取主机10.0.0.7与所有主机(除了主机10.0.0.1之外)通信的ip数据包。
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    20:29:42.366445 IP 10.0.0.210.51642 > 10.0.0.7.zabbix-agent: Flags [S], seq 1999440710, win 29200, options [mss 1460,sackOK,TS val 75899232 ecr 0,nop,wscale 7], length 0
    20:29:42.366483 IP 10.0.0.7.zabbix-agent > 10.0.0.210.51642: Flags [S.], seq 920922656, ack 1999440711, win 28960, options [mss 1460,sackOK,TS val 80531477 ecr 75899232,nop,wscale 7], length 0
    20:29:42.366628 IP 10.0.0.210.51642 > 10.0.0.7.zabbix-agent: Flags [.], ack 1, win 229, options [nop,nop,TS val 75899232 ecr 80531477], length 0
    20:29:42.366674 IP 10.0.0.210.51642 > 10.0.0.7.zabbix-agent: Flags [P.], seq 1:15, ack 1, win 229, options [nop,nop,TS val 75899232 ecr 80531477], length 14
    20:29:42.366681 IP 10.0.0.7.zabbix-agent > 10.0.0.210.51642: Flags [.], ack 15, win 227, options [nop,nop,TS val 80531477 ecr 75899232], length 0
    20:29:42.371129 IP 10.0.0.210.51644 > 10.0.0.7.zabbix-agent: Flags [S], seq 2767440940, win 29200, options [mss 1460,sackOK,TS val 75899236 ecr 0,nop,wscale 7], length 0
    20:29:42.371153 IP 10.0.0.7.zabbix-agent > 10.0.0.210.51644: Flags [S.], seq 3632462468, ack 2767440941, win 28960, options [mss 1460,sackOK,TS val 80531482 ecr 75899236,nop,wscale 7], length 0
    20:29:42.371313 IP 10.0.0.210.51644 > 10.0.0.7.zabbix-agent: Flags [.], ack 1, win 229, options [nop,nop,TS val 75899237 ecr 80531482], length 0
    20:29:42.371397 IP 10.0.0.210.51644 > 10.0.0.7.zabbix-agent: Flags [P.], seq 1:25, ack 1, win 229, options [nop,nop,TS val 75899237 ecr 8

    利用tcpdump抓包详解tcp/ip 连接和断开过程的案例。

    1)正常的TCP连接的三个阶段。
    1. TCP三次握手
    2. 数据传送
    3. TCP四次断开
    2)TCP连接图示。
        TCP连接的状态机制如图10-6所示。
    3)TCP的状态标识。
    • SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。
    • ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收了所有的数据。
    • FIN:(结束标志,FINish)用来结束一个TCP回话。但对应端口仍然处于开放状态,准备接收后续数据。
     
    There are 8 bits in the control bits section of the TCe header:
    CWR | ECE | URG | ACK| PSH | RST|SYN|FIN
     
    [root@doit ~]# tcpdump tcp dst port 80 or src 104.243.30.169 -i eth0 -n
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    20:35:59.136119 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 2702154317:2702154529, ack 1793279353, win 501, length 212
    20:35:59.136535 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 212:408, ack 1, win 501, length 196
    20:35:59.137177 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 408:588, ack 1, win 501, length 180
    20:35:59.137818 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 588:768, ack 1, win 501, length 180
    20:35:59.138447 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 768:948, ack 1, win 501, length 180
    20:35:59.139087 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 948:1128, ack 1, win 501, length 180
    20:35:59.139729 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1128:1308, ack 1, win 501, length 180
    20:35:59.140360 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1308:1488, ack 1, win 501, length 180
    20:35:59.140996 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1488:1668, ack 1, win 501, length 180
    20:35:59.141636 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1668:1848, ack 1, win 501, length 180
    20:35:59.142273 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 1848:2028, ack 1, win 501, length 180
    20:35:59.142908 IP 104.243.30.169.26038 > 111.40.18.151.14656: Flags [P.], seq 2028:2208, ack 1, win 501, length 180
     
     

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

    工作机会(内部推荐):发送邮件至gaoyabing@126.com,看到会帮转内部HR。

    邮件标题:X姓名X_X公司X_简历(如:张三_东方财富_简历),否则一律垃圾邮件!

    公司信息:

    1. 1.东方财富|上海徐汇、南京|微信客户端查看职位(可自助提交信息,微信打开);
  • 相关阅读:
    jmeter参数化文件路径问题
    kafka在linux下安装
    性能测试案例:Oracle重复的SQL
    Elastic:菜鸟上手指南
    python推导式特殊用法
    python动态参数
    python 循环控制
    python 代码执行顺序
    Python eval() 函数
    if __name__ == '__main__': 详解
  • 原文地址:https://www.cnblogs.com/Chary/p/15384347.html
Copyright © 2011-2022 走看看