tcpdump

概述

  • tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析,支持针对协议、主机、网络或端口的过滤,并提供了and 、 or 、 not等逻辑语句来帮助去掉无用的信息
  • tcpdump根据使用者的定义对网络上的数据包进行截获和分析
  • tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,利用这些参数定义的过滤规则就能达到迅速定位故障的目的
  • tcpdump采用命令行格式,它的命令格式为: ```go tcpdump [ -adeflnNOpqStvx] [-c 数量] [-F 文件名]
    1. [-i 网络接口] [-r 文件名] [-s snaplen]
    2. [-T 类型] [-w 文件名] [表达式]

抓包选项: -c:指定要抓取的包数量 -i interface:指定tcpdump需要监听的接口。 -n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。 -nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。 -N:不打印出host的域名部分。例如tcpdump将会打印’nic’而不是’nic.ddn.mil’。 -P:指定要抓取的包是流入还是流出的包。可以给定的值为”in”、”out”和”inout”,默认为”inout”。 -s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。对于要抓取的数据包较大时,长度设置不够可能会产生包截断,若出现包截断, :输出行中会出现”[|proto]”的标志(proto实际会显示为协议名)。但是抓取len越长,包的处理时间越长,并且会减少tcpdump可缓存的数据包的数量, :从而会导致数据包的丢失,所以在能抓取我们想要的包的前提下,抓取长度越小越好。

输出选项: -e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。 -q:快速打印输出。即打印很少的协议相关信息,从而输出行都比较简短。 -X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。 -XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。 -v:当分析和打印的时候,产生详细的输出。 -vv:产生比-v更详细的输出。 -vvv:产生比-vv更详细的输出。

其他功能性选项: -D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都可以用于”-i”后。 -F:从文件中读取抓包的表达式。若使用该选项,则命令行中给定的其他表达式都将失效。 -w:将抓包数据输出到文件中而不是标准输出。可以同时配合”-G time”选项使得输出文件每time秒就自动切换到另一个文件。可通过”-r”选项载入这些文件以进行分析和打印。 -r:从给定的数据包文件中读取数据。使用”-“表示从标准输入中读取。

  1. 表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件
  2. <a name="zswvz"></a>
  3. ## tcpdump使用
  4. - 默认启动
  5. ```go
  6. tcpdump

默认情况下,直接启动tcpdump将监视第一个网络接口(非lo口)上所有流通的数据包。这样抓取的结果会非常多,滚动非常快

  • 监视指定网络接口的数据包

    1. tcpdump -i eth1

    如果不指定网卡,默认tcpdump只会监视第一个网络接口,如eth0。

  • 截获主机hostname发送的所有数据

    1. tcpdump src host hostname
  • 监视所有发送到主机hostname的数据包

    1. tcpdump dst host hostname
  • 对本机的udp 123端口进行监视(123为ntp的服务端口)

    1. tcpdump udp port 123
  • 监视指定主机和端口的数据包

    1. tcpdump tcp port 22 and host hostname
  • 监视指定网络的数据包,如本机与192.168网段通信的数据包,”-c 10”表示只抓取10个包

    1. tcpdump -c 10 net 192.168
  • 抓取到本机22端口包 ```go [root@server2 ~]# tcpdump -c 10 -nn -i eth0 tcp dst port 22

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 12:06:57.574293 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 535528834, win 2053, length 0 12:06:57.629125 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 193, win 2052, length 0 12:06:57.684688 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 385, win 2051, length 0 12:06:57.738977 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 577, win 2050, length 0 12:06:57.794305 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 769, win 2050, length 0 12:06:57.848720 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 961, win 2049, length 0 12:06:57.904057 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1153, win 2048, length 0 12:06:57.958477 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1345, win 2047, length 0 12:06:58.014338 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1537, win 2053, length 0 12:06:58.069361 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1729, win 2052, length 0 10 packets captured 10 packets received by filter 0 packets dropped by kernel

  1. - 解析包数据
  2. ```go
  3. [root@server2 ~]# tcpdump -c 2 -q -XX -vvv -nn -i eth0 tcp dst port 22
  4. tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
  5. 12:15:54.788812 IP (tos 0x0, ttl 64, id 19303, offset 0, flags [DF], proto TCP (6), length 40)
  6. 192.168.100.1.5788 > 192.168.100.62.22: tcp 0
  7. 0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
  8. 0x0010: 0028 4b67 4000 4006 a5d8 c0a8 6401 c0a8 .(Kg@.@.....d...
  9. 0x0020: 643e 169c 0016 2426 5fd6 1fec 2b62 5010 d>....$&_...+bP.
  10. 0x0030: 0803 7844 0000 0000 0000 0000 ..xD........
  11. 12:15:54.842641 IP (tos 0x0, ttl 64, id 19304, offset 0, flags [DF], proto TCP (6), length 40)
  12. 192.168.100.1.5788 > 192.168.100.62.22: tcp 0
  13. 0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
  14. 0x0010: 0028 4b68 4000 4006 a5d7 c0a8 6401 c0a8 .(Kh@.@.....d...
  15. 0x0020: 643e 169c 0016 2426 5fd6 1fec 2d62 5010 d>....$&_...-bP.
  16. 0x0030: 0801 7646 0000 0000 0000 0000 ..vF........
  17. 2 packets captured
  18. 2 packets received by filter
  19. 0 packets dropped by kernel

netstat

概述

  • netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于校验本机各端口的网络连接情况
  • netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接、对TCP和UDP的监听及获取进程内存管理的相关报告
  • netstat的命令格式:
    1. netstat [-acCeFghilMnNoprstuvVwx] [-A< 网络类型>] [--ip]

常见参数

-a或—all :显示所有连线中的Socket。-c或—continuous 持续列出网络状态
-g或—groups :显示多重广播功能群组组员名单
-l或—listening :显示监控中的服务器的Socket
-n或—numeric :直接使用IP地址,而不通过域名服务器
-o或—timers :显示计时器
-p或—programs :显示正在使用Socket的程序识别码和程序名称
-r或—route :显示Routing Table
-s或—statistics :显示网络工作信息统计表
-t或—tcp :显示TCP传输协议的连线状况
-u或—udp :显示UDP传输协议的连线状况

参数使用

  • 只列出 TCP 或 UDP 协议的连接?

    1. netstat -at | netstat -au
    2. Active Internet connections (servers and established)
    3. Proto Recv-Q Send-Q Local Address Foreign Address State
    4. tcp 0 0 enlightened:domain *:* LISTEN
    5. tcp 0 0 localhost:ipp *:* LISTEN
    6. tcp 0 0 enlightened.local:36310 del01s07-in-f24.1:https ESTABLISHED
    7. tcp 0 0 enlightened.local:45038 a96-17-181-10.depl:http ESTABLISHED
    8. tcp 0 0 enlightened.local:37892 ABTS-North-Static-:http ESTABLISHED
  • 获取进程名、进程号以及用户 ID?

    1. ~$ sudo netstat -nlpt
    2. Active Internet connections (only servers)
    3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    4. tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1144/dnsmasq
    5. tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 661/cupsd
    6. tcp6 0 0 ::1:631 :::* LISTEN 661/cupsd
  • 显示内核路由信息?

    1. $ netstat -rn
    2. Kernel IP routing table
    3. Destination Gateway Genmask Flags MSS Window irtt Iface
    4. 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
    5. 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
  • netstat 持续输出?

    1. $ netstat -ct

结果字段解释

Proto:协议名(tcp协议还是udp协议);
recv-Q:网络接收队列
表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击;
send-Q:网路发送队列
对方没有收到的数据或者说没有Ack的,还是本地缓冲区.
如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快;
这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。
Local Address 解释
1)Local Address 部分的0.0.0.0:873表示监听服务器上所有ip地址的所有(0.0.0.0表示本地所有ip),比如你的服务器是有172.172.230.210和172.172.230.11两个ip地址,那么0.0.0.0:873此时表示监听172.172.230.210,172.172.230.211,127.0.0.1三个地址的873端口

2)127.0.0.1:25这个表示监听本机的loopback地址的25端口(如果某个服务只监听了回环地址,那么只能在本机进行访问,无法通过tcp/ip 协议进行远程访问)

3)192.168.1.81:2288这是因为我们在启动的时候指定了192.168.1.81:2288参数,如果不指定的话,会监听0.0.0.0:2288
Foreign Address解释:与本机端口通信的外部socket
State解释
链路状态,共有11种

  1. LISTEN :首先服务端需要打开一个socket进行监听,状态为LISTEN.
  2. 侦听来自远方TCP端口的连接请求
  3. SYN_SENT:客户端通过应用程序调用connect进行activeopen.
  4. 于是客户端tcp发送一个SYN以请求建立一个连接.之后状态SYN_SENT
  5. 在发送连接请求后等待匹配的连接请求
  6. SYN_RECV:服务端应发出ACK确认客户端的 SYN,同时自己向客户端发送一个SYN.之后状态置为SYN_RECV
  7. 在收到和发送一个连接请求后等待对连接请求的确认
  8. ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了
  9. FIN_WAIT1:主动关闭(activeclose)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,
  10. 之后进入FIN_WAIT1状态
  11. CLOSE_WAIT:被动关闭(passiveclose)端TCP接到FIN后,就发出ACK以回应FIN请求
  12. FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2
  13. LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程 序将调用CLOSE关闭连接。
  14. 这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK.
  15. TIME_WAIT:在主动关闭端接收到FIN后,TCP 就发送ACK包,并进入TIME-WAIT状态。
  16. CLOSING:比较少见.
  17. CLOSED:被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束
  18. UNKNOWN:未知的Socket状态。

Destination:目标网络或者主机。
Gateway:网关地址,如果没有设置则为
Genmask:目标网络掩码;如果默认路由则用”0.0.0.0”。
*Flags
标志说明:

  1. U Up表示此路由当前为启动状态
  2. H Host,表示此网关为一主机
  3. G Gateway,表示此网关为一路由器
  4. R Reinstate Route,使用动态路由重新初始化的路由
  5. D Dynamically,此路由是动态性地写入
  6. M Modified,此路由是由路由守护程序或导向器动态修改
  7. ! 表示此路由当前为关闭状态

Iface:对于这个路由,数据包将要发送到那个接口(网卡)

lsof

概述

  • lsof是一个是一个列出当前系统打开文件的工具
  • 在Linux下,万物皆是以文件形式存在的,并且系统在后台都为该应用程序分配了一个文件描述符,通过该文件描述符能掌握大量关于该应用程序的信息,因此通过lsof查看这个列表对系统监测以及排错将是有很大帮助的
  • 执行l s o f lsoflsof命令,输出结果如下:

image.png
1)COMMAND:进程的名称
2)PID:进程标识符
3)USER:进程所有者
4)FD:文件描述符,应用程序通过文件描述符识别该文件,如cwd、txt等
5)TYPE:文件类型,如D I R 、 R E G DIR、REGDIR、REG等
6)DEVICE:指定磁盘的名称
7)SIZE:文件的大小
8)NODE:索引节点(文件在磁盘上的标识)
9)NAME:打开文件的确切名称

常见参数列表

  1. lsof filename 显示开启文件的进程
  2. lsof dir 查找谁在使用文件目录系统
  3. lsof -i :22 知道22端口被哪个进程占用
  4. lsof -c abc 显示abc进程现在打开的文件
  5. lsof -g gid 显示归属gid的进程情况
  6. lsof -n 不将IP转换为hostname,缺省是不加上-n参数
  7. lsof -p 12 看进程号为12的进程打开了哪些文件
  8. lsof -u username 查看用户打开哪些文件

[

](https://blog.csdn.net/qq_38790716/article/details/85486681)

常用命令

  • 查看6666端口现在运行情况

image.png

  • 查看所属root用户进程所打开的文件,文件类型为.txt
    image.png

  • 监控程序,如查看指定程序server打开的文件

image.png

ss

概述

  • ss是Socket Statistics的缩写,顾名思义用于显示socket状态的统计
  • 它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关PTCP和连接状态的信息,而且比netstat更快速更高效(连接数越大越明显)
  • ss的命令格式:
    1. ss [option]
    2. ss [option] [过滤]

详细参数

  1. root@VM-0-2-ubuntu:/home/ubuntu# ss -h
  2. Usage: ss [ OPTIONS ]
  3. ss [ OPTIONS ] [ FILTER ]
  4. -h, --help //帮助信息
  5. -V, --version //程序版本信息
  6. -n, --numeric //不解析服务名称
  7. -r, --resolve //解析主机名
  8. -a, --all //显示所有套接字
  9. -l, --listening //显示监听状态的套接字
  10. -o, --options //扩展选项
  11. -e, --extended //显示详细的套接字信息
  12. -m, --memory //显示套接字的内存使用情况
  13. -p, --processes //显示使用套接字的进程
  14. -s, --summary //显示套接字使用概况
  15. -b, --bpf //显示BPF过滤器套接字信息
  16. -E, --events //在被破环时不断显示套接字
  17. -Z, --context //显示SELinux的安全上下文过程
  18. -z, --contexts //显示过程和Socket SELinux的安全上下文
  19. -N, --net //切换到指定的网络命名空间名称
  20. -4, --ipv4 //仅显示IPV4的套接字
  21. -6, --ipv6 //仅显示iPV6的套接字
  22. -0, --packet display PACKET sockets
  23. -t, --tcp display only TCP sockets
  24. -S, --sctp display only SCTP sockets
  25. -u, --udp display only UDP sockets
  26. -d, --dccp display only DCCP sockets
  27. -w, --raw display only RAW sockets
  28. -x, --unix display only Unix domain sockets
  29. --vsock display only vsock sockets

常见用法

  • 显示所有网络连接
    image.png

  • 显示TCP连接

image.png

  • 显示Sockets摘要信息

image.png

  • 列出所有处在listening状态的socket

image.png

  • 显示所有状态为Established的HTTP连接

    1. [root@localhost ~]# ss -o state established '( dport = :http or sport = :http )'
    2. Recv-Q Send-Q Local Address:Port Peer Address:Port
    3. 0 0 75.126.153.214:2164 192.168.10.42:http
  • 列举出处于 FIN-WAIT-1状态的源端口为80或者443,目标网络为 193.233.7/24所有 tcp套接字

    1. ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24
  • 用TCP 状态过滤Sockets

    1. [root@localhost ~]#ss -4 state closing
    2. Recv-Q Send-Q Local Address:Port Peer Address:Port
    3. 1 11094 75.126.153.214:http 192.168.10.42:4669

    说明:
    FILTER-NAME-HERE 可以代表以下任何一个:

  • established

  • syn-sent
  • syn-recv
  • fin-wait-1
  • fin-wait-2
  • time-wait
  • closed
  • close-wait
  • last-ack
  • listen
  • closing
  • all : 所有以上状态

  • 匹配本地地址和端口号 ```go 命令:

ss src ADDRESS_PATTERN ss src 192.168.119.103 ss src 192.168.119.103:http ss src 192.168.119.103:80 ss src 192.168.119.103:smtp ss src 192.168.119.103:25

  1. ```go
  2. [root@localhost ~]# ss src 192.168.119.103:16021
  3. State Recv-Q Send-Q Local Address:Port Peer Address:Port
  4. ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63054
  5. ESTAB 0 0 192.168.119.103:16021 192.168.119.201:62894
  • 将本地或者远程端口和一个数比较
    1. [root@localhost ~]# ss sport = :http
    2. [root@localhost ~]# ss dport = :http
    3. [root@localhost ~]# ss dport \> :1024
    4. [root@localhost ~]# ss sport \> :1024
    5. [root@localhost ~]# ss sport \< :32000
    6. [root@localhost ~]# ss sport eq :22
    7. [root@localhost ~]# ss dport != :22
    8. [root@localhost ~]# ss state connected sport = :http
    9. [root@localhost ~]# ss \( sport = :http or sport = :https \)
    10. [root@localhost ~]# ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24

nslookup

nslookup用于查询DNS的记录,查询域名解析是否正常,在网络故障时用来诊断网络问题

  1. nslookup www.baidu.com
  2. Server: 202.96.134.133
  3. Address: 202.96.134.133#53
  4. Non-authoritative answer:
  5. www.baidu.com canonical name = www.a.shifen.com. // 百度的cname指向www.a.shifen.com
  6. Name: www.a.shifen.com
  7. Address: 14.215.177.39 //对应的ip地址
  8. Name: www.a.shifen.com
  9. Address: 14.215.177.38 //对应的ip地址

前两行,server 、Address是上连的DNS服务器ip地址和端口(连上的DNS服务器地址不同,获取的百度地址的ip可能不同)

ps:
A记录:又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器
CNAME:通常称别名指向。您可以为一个主机设置别名。比如设置test.mydomain.com,用来指向一个主机www.rddns.com那么以后就可以用test.mydomain.com来代替访问www.rddns.com了。