tcpdump
概述
- tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析,支持针对协议、主机、网络或端口的过滤,并提供了and 、 or 、 not等逻辑语句来帮助去掉无用的信息
- tcpdump根据使用者的定义对网络上的数据包进行截获和分析
- tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,利用这些参数定义的过滤规则就能达到迅速定位故障的目的
- tcpdump采用命令行格式,它的命令格式为:
```go
tcpdump [ -adeflnNOpqStvx] [-c 数量] [-F 文件名]
[-i 网络接口] [-r 文件名] [-s snaplen]
[-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:从给定的数据包文件中读取数据。使用”-“表示从标准输入中读取。
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件
<a name="zswvz"></a>
## tcpdump使用
- 默认启动
```go
tcpdump
默认情况下,直接启动tcpdump将监视第一个网络接口(非lo口)上所有流通的数据包。这样抓取的结果会非常多,滚动非常快
监视指定网络接口的数据包
tcpdump -i eth1
如果不指定网卡,默认tcpdump只会监视第一个网络接口,如eth0。
截获主机hostname发送的所有数据
tcpdump src host hostname
监视所有发送到主机hostname的数据包
tcpdump dst host hostname
对本机的udp 123端口进行监视(123为ntp的服务端口)
tcpdump udp port 123
监视指定主机和端口的数据包
tcpdump tcp port 22 and host hostname
监视指定网络的数据包,如本机与192.168网段通信的数据包,”-c 10”表示只抓取10个包
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
- 解析包数据
```go
[root@server2 ~]# tcpdump -c 2 -q -XX -vvv -nn -i eth0 tcp dst port 22
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:15:54.788812 IP (tos 0x0, ttl 64, id 19303, offset 0, flags [DF], proto TCP (6), length 40)
192.168.100.1.5788 > 192.168.100.62.22: tcp 0
0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
0x0010: 0028 4b67 4000 4006 a5d8 c0a8 6401 c0a8 .(Kg@.@.....d...
0x0020: 643e 169c 0016 2426 5fd6 1fec 2b62 5010 d>....$&_...+bP.
0x0030: 0803 7844 0000 0000 0000 0000 ..xD........
12:15:54.842641 IP (tos 0x0, ttl 64, id 19304, offset 0, flags [DF], proto TCP (6), length 40)
192.168.100.1.5788 > 192.168.100.62.22: tcp 0
0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
0x0010: 0028 4b68 4000 4006 a5d7 c0a8 6401 c0a8 .(Kh@.@.....d...
0x0020: 643e 169c 0016 2426 5fd6 1fec 2d62 5010 d>....$&_...-bP.
0x0030: 0801 7646 0000 0000 0000 0000 ..vF........
2 packets captured
2 packets received by filter
0 packets dropped by kernel
netstat
概述
- netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于校验本机各端口的网络连接情况
- netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接、对TCP和UDP的监听及获取进程内存管理的相关报告
- netstat的命令格式:
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 协议的连接?
netstat -at | netstat -au
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 enlightened:domain *:* LISTEN
tcp 0 0 localhost:ipp *:* LISTEN
tcp 0 0 enlightened.local:36310 del01s07-in-f24.1:https ESTABLISHED
tcp 0 0 enlightened.local:45038 a96-17-181-10.depl:http ESTABLISHED
tcp 0 0 enlightened.local:37892 ABTS-North-Static-:http ESTABLISHED
获取进程名、进程号以及用户 ID?
~$ sudo netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1144/dnsmasq
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 661/cupsd
tcp6 0 0 ::1:631 :::* LISTEN 661/cupsd
显示内核路由信息?
$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
netstat 持续输出?
$ 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种
LISTEN :首先服务端需要打开一个socket进行监听,状态为LISTEN.
侦听来自远方TCP端口的连接请求
SYN_SENT:客户端通过应用程序调用connect进行activeopen.
于是客户端tcp发送一个SYN以请求建立一个连接.之后状态SYN_SENT。
在发送连接请求后等待匹配的连接请求
SYN_RECV:服务端应发出ACK确认客户端的 SYN,同时自己向客户端发送一个SYN.之后状态置为SYN_RECV
在收到和发送一个连接请求后等待对连接请求的确认
ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了
FIN_WAIT1:主动关闭(activeclose)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,
之后进入FIN_WAIT1状态
CLOSE_WAIT:被动关闭(passiveclose)端TCP接到FIN后,就发出ACK以回应FIN请求
FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2
LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程 序将调用CLOSE关闭连接。
这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK.
TIME_WAIT:在主动关闭端接收到FIN后,TCP 就发送ACK包,并进入TIME-WAIT状态。
CLOSING:比较少见.
CLOSED:被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束
UNKNOWN:未知的Socket状态。
Destination:目标网络或者主机。
Gateway:网关地址,如果没有设置则为。
Genmask:目标网络掩码;如果默认路由则用”0.0.0.0”。
*Flags标志说明:
U Up表示此路由当前为启动状态
H Host,表示此网关为一主机
G Gateway,表示此网关为一路由器
R Reinstate Route,使用动态路由重新初始化的路由
D Dynamically,此路由是动态性地写入
M Modified,此路由是由路由守护程序或导向器动态修改
! 表示此路由当前为关闭状态
Iface:对于这个路由,数据包将要发送到那个接口(网卡)
lsof
概述
- lsof是一个是一个列出当前系统打开文件的工具
- 在Linux下,万物皆是以文件形式存在的,并且系统在后台都为该应用程序分配了一个文件描述符,通过该文件描述符能掌握大量关于该应用程序的信息,因此通过lsof查看这个列表对系统监测以及排错将是有很大帮助的
- 执行l s o f lsoflsof命令,输出结果如下:
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:打开文件的确切名称
常见参数列表
lsof filename 显示开启文件的进程
lsof dir 查找谁在使用文件目录系统
lsof -i :22 知道22端口被哪个进程占用
lsof -c abc 显示abc进程现在打开的文件
lsof -g gid 显示归属gid的进程情况
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -p 12 看进程号为12的进程打开了哪些文件
lsof -u username 查看用户打开哪些文件
[
](https://blog.csdn.net/qq_38790716/article/details/85486681)
常用命令
- 查看6666端口现在运行情况
查看所属root用户进程所打开的文件,文件类型为.txt
监控程序,如查看指定程序server打开的文件
ss
概述
- ss是Socket Statistics的缩写,顾名思义用于显示socket状态的统计
- 它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关PTCP和连接状态的信息,而且比netstat更快速更高效(连接数越大越明显)
- ss的命令格式:
ss [option]
ss [option] [过滤]
详细参数
root@VM-0-2-ubuntu:/home/ubuntu# ss -h
Usage: ss [ OPTIONS ]
ss [ OPTIONS ] [ FILTER ]
-h, --help //帮助信息
-V, --version //程序版本信息
-n, --numeric //不解析服务名称
-r, --resolve //解析主机名
-a, --all //显示所有套接字
-l, --listening //显示监听状态的套接字
-o, --options //扩展选项
-e, --extended //显示详细的套接字信息
-m, --memory //显示套接字的内存使用情况
-p, --processes //显示使用套接字的进程
-s, --summary //显示套接字使用概况
-b, --bpf //显示BPF过滤器套接字信息
-E, --events //在被破环时不断显示套接字
-Z, --context //显示SELinux的安全上下文过程
-z, --contexts //显示过程和Socket SELinux的安全上下文
-N, --net //切换到指定的网络命名空间名称
-4, --ipv4 //仅显示IPV4的套接字
-6, --ipv6 //仅显示iPV6的套接字
-0, --packet display PACKET sockets
-t, --tcp display only TCP sockets
-S, --sctp display only SCTP sockets
-u, --udp display only UDP sockets
-d, --dccp display only DCCP sockets
-w, --raw display only RAW sockets
-x, --unix display only Unix domain sockets
--vsock display only vsock sockets
常见用法
显示所有网络连接
显示TCP连接
- 显示Sockets摘要信息
- 列出所有处在listening状态的socket
显示所有状态为Established的HTTP连接
[root@localhost ~]# ss -o state established '( dport = :http or sport = :http )'
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 75.126.153.214:2164 192.168.10.42:http
列举出处于 FIN-WAIT-1状态的源端口为80或者443,目标网络为 193.233.7/24所有 tcp套接字
ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24
用TCP 状态过滤Sockets
[root@localhost ~]#ss -4 state closing
Recv-Q Send-Q Local Address:Port Peer Address:Port
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
```go
[root@localhost ~]# ss src 192.168.119.103:16021
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.119.103:16021 192.168.119.201:63054
ESTAB 0 0 192.168.119.103:16021 192.168.119.201:62894
- 将本地或者远程端口和一个数比较
[root@localhost ~]# ss sport = :http
[root@localhost ~]# ss dport = :http
[root@localhost ~]# ss dport \> :1024
[root@localhost ~]# ss sport \> :1024
[root@localhost ~]# ss sport \< :32000
[root@localhost ~]# ss sport eq :22
[root@localhost ~]# ss dport != :22
[root@localhost ~]# ss state connected sport = :http
[root@localhost ~]# ss \( sport = :http or sport = :https \)
[root@localhost ~]# ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24
nslookup
nslookup用于查询DNS的记录,查询域名解析是否正常,在网络故障时用来诊断网络问题
nslookup www.baidu.com
Server: 202.96.134.133
Address: 202.96.134.133#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com. // 百度的cname指向www.a.shifen.com
Name: www.a.shifen.com
Address: 14.215.177.39 //对应的ip地址
Name: www.a.shifen.com
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了。