目录
概述
本文介绍下在应急响应过程中,linux系统下排查网络可能用到的命令,有些命令选项很多,读者可以仅看常用选项。
netstat
netstat 命令以符号形式显示各种与网络相关的数据结构的内容。根据所选选项,有多种输出格式可供选择。
- 命令的第一种形式显示每个协议的活动套接字列表。
- 第二种形式根据所选选项显示其他网络数据结构的内容。
- 使用第三种形式,并指定等待间隔,netstat 将持续显示已配置的网络接口上的数据包流量信息。
- 第四种形式显示指定协议或地址族的统计信息。如果指定了等待间隔,则会显示过去若干秒内的协议信息。
- 第五种形式显示指定协议或地址族的每个接口的统计信息。
- 第六种形式显示 mbuf(9) 的统计信息。
- 第七种形式显示指定地址族的路由表。
- 第八种形式显示路由统计信息。
默认显示活动套接字的本地和远程地址、发送和接收队列大小(以字节为单位)、协议以及协议的内部状态。地址格式的形式为“host.port”或“network.port”,如果套接字的地址指定了一个网络但没有具体的主机地址。如果已知,主机和网络地址将根据/etc/hosts和/etc/networks数据库进行符号显示。如果对于一个地址的符号名称未知,或者指定了-n选项,该地址将按照地址族的方式以数值形式打印出来。
网络共有12中可能的状态,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的:
- LISTEN:首先服务端需要打开一个socket进行监听,状态为 LISTEN,侦听来自远方TCP端口的连接请求 ;
- SYN_SENT:客户端通过应用程序调用connect进行active open,于是客户端tcp发送一个SYN以请求建立一个连接,之后状态置为 SYN_SENT,在发送连接请求后等待匹配的连接请求;
- SYN_RECV:服务端应发出ACK确认客户端的 SYN,同时自己向客户端发送一个SYN,之后状态置为,在收到和发送一个连接请求后等待对连接请求的确认;
- ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了, 代表一个打开的连接,数据可以传送给用户;
- FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态, 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
- CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT, 等待从本地用户发来的连接中断请求;
- FIN_WAIT2:主动关闭端接到ACK后,就进入了 FIN-WAIT-2,从远程TCP等待连接中断请求;
- LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程 序将调用CLOSE关闭连接,这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK,等待原来发向远程TCP的连接中断请求的确认;
- TIME_WAIT:在主动关闭端接收到FIN后,TCP 就发送ACK包,并进入TIME-WAIT状态,等待足够的时间以确保远程TCP接收到连接中断请求的确认;
- CLOSING: 比较少见,等待远程TCP对连接中断的确认;
- CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态,连接结束,没有任何连接状态;
- UNKNOWN:未知的Socket状态;
常见标志位
- SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。
- ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。
- FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
标题行解释
- Proto:协议类型,表示套接字使用的协议,例如TCP、UDP等。
- Local Address:本地地址,即本地主机的IP地址和端口号。
- Foreign Address:远程地址,即与本地主机建立连接的对方主机的IP地址和端口号。
- State:连接的状态,表示套接字当前所处的内部状态。
- Send-Q:发送队列的大小,表示等待发送的数据在发送队列中的字节数。
- Recv-Q:接收队列的大小,表示等待接收的数据在接收队列中的字节数。
- PID/Program name:关联的进程ID和对应的程序名称。
- Timer: - 第一个值表示定时器的状态,可以是"off"(关闭)、“on”(开启)或其他特定的定时器状态。 第二个值表示定时器的剩余时间,以秒为单位。 第三个值表示定时器超时次数。
选项
-r, --route 显示路由表
-I, --interfaces=<Iface> 显示指定接口的接口表
-i, --interfaces 显示接口表
-g, --groups 显示组播组成员
-s, --statistics 显示网络统计信息(如 SNMP)
-M, --masquerade 显示伪装连接
-v, --verbose 显示详细信息
-W, --wide 不截断 IP 地址
-n, --numeric 不解析名称
--numeric-hosts 不解析主机名
--numeric-ports 不解析端口名
--numeric-users 不解析用户名
-N, --symbolic 解析硬件名称
-e, --extend 显示其他/更多信息
-p, --programs 显示套接字的 PID/程序名
-o, --timers 显示计时器
-c, --continuous 连续列出
-l, --listening 显示正在监听的服务器套接字
-a, --all 显示所有套接字(默认:已连接)
-F, --fib 显示转发信息库(默认)
-C, --cache 显示路由缓存而非 FIB
-Z, --context 显示套接字的 SELinux 安全上下文
常用选项组合
netstat -nalop 列出监听中的端口
netstat -tulnp 显示所有的监听状态的TCP 和 UDP 连接
netstat -atunp 显示所有的 TCP 和 UDP 连接
netstat -nr 显示当前的路由表
netstat -s 显示传输层协议(TCP、UDP)的统计信息
查看连接某服务端口最多的的IP地址
以80端口为例
netstat-ntu|grep :80 |awk'{print $5}'|cut -d: -f1|awk'{++ip[$1]} END {for(i in ip) print ip[i],"\t",i}'|sort-nr
实验
python3 -m http.server 8080
ps结果
ps-axf|grep python
netstat结果
ss-比netstat更好用的工具
选项
-h, --help 帮助信息
-V, --version 程序版本信息
-n, --numeric 不解析服务名称
-r, --resolve 解析主机名
-a, --all 显示所有套接字(sockets)
-l, --listening 显示监听状态的套接字(sockets)
-o, --options 显示计时器信息
-e, --extended 显示详细的套接字(sockets)信息
-m, --memory 显示套接字(socket)的内存使用情况
-p, --processes 显示使用套接字(socket)的进程
-i, --info 显示 TCP内部信息
-s, --summary 显示套接字(socket)使用概况
-4, --ipv4 仅显示IPv4的套接字(sockets)
-6, --ipv6 仅显示IPv6的套接字(sockets)
-0, --packet 显示 PACKET 套接字(socket)
-t, --tcp 仅显示 TCP套接字(sockets)
-u, --udp 仅显示 UCP套接字(sockets)
-d, --dccp 仅显示 DCCP套接字(sockets)
-w, --raw 仅显示 RAW套接字(sockets)
-x, --unix 仅显示 Unix套接字(sockets)
-f, --family=FAMILY 显示 FAMILY类型的套接字(sockets),FAMILY可选,支持 unix, inet, inet6, link, netlink
-A, --query=QUERY, --socket=QUERY
QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D, --diag=FILE 将原始TCP套接字(sockets)信息转储到文件
-F, --filter=FILE 从文件中都去过滤器信息
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
ifconfig-网络接口信息
eth0 表示第一块网卡。
inet 用来表示网卡的IP地址,广播地址broadcast,掩码地址netmask。
lo 是表示主机的回坏地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 httpd服务器的指定到回坏地址,在浏览器输入127.0.0.1就能看到你所架WEB网站了。但只是您能看得到,局域网的其它主机或用户无从知道。
MTU(最大传输单元),单位 字节。
混杂模式会有 UPBROADCAST RUNNING PROMISC MULTICAST 字样。
ip-网络接口信息
选项
语法
ip(选项)(对象)
Usage: ip[ OPTIONS ] OBJECT { COMMAND |help}ip[-force]-batch filename
选项
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
-4 | -6 | -I | -D | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } |
-o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -a[ll] }
网络对象:指定要管理的网络对象;
具体操作:对指定的网络对象完成具体操作;
help:显示网络对象支持的操作命令的帮助信息。
对象
OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
netns | l2tp | macsec | tcp_metrics | token }
-V:显示指令版本信息;
-s:输出更详细的信息;
-f:强制使用指定的协议族;
-4:指定使用的网络层协议是IPv4协议;
-6:指定使用的网络层协议是IPv6协议;
-0:输出信息每条记录输出一行,即使内容较多也不换行显示;
-r:显示主机时,不使用IP地址,而使用主机的域名。
查看地址
ip addr
查看路由
ip route
tcpdump-抓包
tcpdump是一个在命令行下使用的网络数据包分析工具。它能够实时捕获网络接口上的数据包,并将其以可读的格式展示出来。tcpdump可以帮助网络管理员和开发人员分析网络流量,诊断网络问题,了解网络通信的细节。
以下是一些tcpdump的特点和功能:
- 支持多种操作系统:tcpdump可在多种操作系统平台上运行,包括Linux、macOS和Windows。
- 强大的过滤器:tcpdump支持使用BPF(Berkeley Packet Filter)语法进行复杂的数据包过滤。用户可以根据协议类型、IP地址、端口等条件来过滤捕获的数据包,以便集中关注感兴趣的内容。
- 解析多种网络协议:tcpdump能够解析和展示多种网络协议的数据包信息,包括以太网、IPv4和IPv6、TCP、UDP、ICMP等。它还能识别常见的应用层协议,如HTTP、DNS、SSH等。
- 保存和读取数据包:tcpdump可以将捕获到的数据包保存为文件,方便之后的离线分析和查看。同时,它也能读取保存的数据包文件,并将其展示出来。
- 灵活的输出格式控制:tcpdump提供了多种输出格式控制选项,可以根据需要选择展示的信息,如源和目的IP地址、端口号、时间戳等。
- 支持IPv6:tcpdump对IPv6协议有很好的支持,能够分析和捕获IPv6数据包。
以下是tcpdump的一个输出示例
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:55:37.416400 IP (tos 0x10, ttl 64, id40393, offset 0, flags [DF], proto TCP (6), length 188)10.0.0.6.36000 >175.27.43.112.49492: Flags [P.], cksum 0x10ac (correct), seq3375829152:3375829300, ack 2610564101, win 261, length 1481 packet captured
3 packets received by filter
0 packets dropped by kernel
- 18:55:37.416400:时间戳,格式为时:分:秒.毫秒。表示该数据包在捕获时的时间。
- IP:指示协议类型,这里是IP(Internet Protocol)。
- (tos 0x10, ttl 64, id 40393, offset 0, flags [DF], proto TCP (6), length 188):IP包头,含有与该IP数据包相关的信息: - tos 0x10:服务类型,十六进制数值0x10转换成二进制为00010000,表示该数据包传输优先级比较高。- ttl 64:time to live(生存时间),表示该数据包能在网络中存活的最大时间,避免数据包在网络中无限制地循环传输,防止数据包不断在网络中转发而不能被丢弃。- id 40393:IP数据报的唯一标识符,用于标识该数据包。- offset 0:偏移量,表示该数据包在分片(fragmentation)后的位置。- flags [DF]:标志位,DF代表“Don’t Fragment”,表示该数据包不可以分片。- proto TCP (6):指示数据包使用的协议为TCP(Transmission Control Protocol)。- length 188:表示该IP数据包(包括IP协议头和TCP协议头)的长度,以字节为单位。
- 10.0.0.6.36000 > 175.27.43.112.49492:源和目的IP地址及端口号,分别表示数据包的发送者和接收者的IP地址及端口号。.36000是源端口号,.49492是目标端口号。
- Flags [P.]:TCP标志位,P代表“Push”,. 点表示ACK或SYN标志没有被置位。
- cksum 0x10ac (correct):校验和,用于检测数据的完整性。
- seq 3375829152:3375829300:序列号,表示数据包中所携带数据的序列号范围。
- ack 2610564101:确认号,表示上一条成功接收的数据包中下一条期望接受的序列号。
- win 261:窗口大小,表示接收方缓冲区的大小。
- length 148:表示数据包中携带数据的长度,以字节为单位。
选项
tcpdump --help
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ][-C file_size ][-E algo:secret ][-Ffile][-G seconds ][-i interface ][-j tstamptype ][-M secret ][--number][ -Q|-P in|out|inout ][-rfile][-s snaplen ][ --time-stamp-precision precision ][ --immediate-mode ][-Ttype][--version][-Vfile][-wfile][-W filecount ][-y datalinktype ][-z postrotate-command ][-Z user ][ expression ]
解释如下:
-a:以ASCII码打印网络层和传输层的信息。
-A:以ASCII码打印应用层的信息(比如HTTP、SMTP等),同时忽略掉网络层和传输层的信息。
-c:抓取指定数量的数据包后停止,比如-c 10表示只抓取10个数据包。
-D:列出系统上可用的网络接口列表。
-e:以详细格式输出数据包,包括链路层信息(比如源MAC地址、目标MAC地址等)。
-E:将数据包导出到指定文件中,可以配合-r选项使用。
-f:不将抓取到的数据包放入缓存中,直接输出。
-F:从指定文件中读取过滤条件。
-G:循环运行tcpdump并每隔指定时间生成一个新的捕获文件。
-i:指定监听的网络接口,比如-i eth0代表监听eth0接口。
-l:使用线路缓冲(line-buffered)模式,并在屏幕上实时输出数据包。
-n:不将地址转化为名称,直接以数字形式输出。
-N:不解析任何名称,直接以数字形式输出。
-O:关闭指定的输出选项,比如-O ip表示关闭IP层信息的输出。
-p:设置为非混杂模式,只监听本机上发往该机器或者由该机器发出的数据包。
-q:以更精简的格式输出捕获到的数据包。
-r:从指定文件中读取并解析数据包,而不是从网络中抓取数据包。
-s:指定捕获数据包的截止长度,比如-s 200表示只抓取前200个字节。
-S:以绝对时间戳(精确到微秒)格式输出数据包。
-t:不打印时间戳。
-T:指定输出文件的格式,可以是ASCII、PS、PDF等格式。
-u:使用无缓存模式,即立即输出接收到的所有数据包。
-v:详细输出tcpdump的运行状态和统计信息。
-vvv:输出更详细的信息。
-w:将捕获到的数据包保存到指定的文件中,可以配合-r选项使用。
-x:以十六进制格式输出每个字节的内容。
-X:以十六进制和ASCII码的形式输出每个字节的内容。
-y:指定抓取的数据包类型,比如以“link”抓取链路层数据包。
一以下指定多个时需要通过and或or连接
- host: 主机
- port:端口
- src: 源
- dst: 目的
- net: 网段CIDR格式
- proto:指定协议 \协议名称
常用选项组合
tips:多个条件可以使用and、or进行连接,有的也可以使用逗号填写多个值
抓取所有数据包
不清楚任何条件时使用,一般时间短
tcpdump
抓取指定数量的数据包
tcpdump -c1
抓取指定网卡的数据包
可使用ifconfig等命令查看当前的网卡,然后指定
tcpdump -i eth0
抓取指定ip的数据包
可以通过host、src或dst指定ip、源ip或目的ip
tcpdump dst 10.0.0.6
tcpdump dst 10.0.0.6 and src 175.27.43.112 -c1
抓取指定端口的数据包
tcpdump src 10.0.0.6 and src port 36000-c1
捕获所有报文内容
-s为0时可以捕获到最大字节262144的数据包
优化加速
-nn不解析域名和端口,用于抓取大量数据包时
提取 HTTP 请求的主机名和路径
tcpdump -s0-v-n|egrep-i"POST /|GET /|Host:"
同理,可以抓取代理、cookies、账号密码等,例如代理:
tcpdump -nn-A-s1500-l|grep"User-Agent:"
保存数据包到文件
tcpdump -i eth0 -c1-w eth0.pcap
之后可以使用wireshark打开
iptables、firewalld-防火墙设置
之前写过,不再重复
Linux-Centos7学习笔记
更多主机安全相关命令:
应急响应-主机安全之文件相关命令(Linux操作系统)
应急响应-主机安全之系统及进程排查相关命令(Linux操作系统-初级篇)
参考
《网络安全应急响应技术实战指南》
版权归原作者 lady_killer9 所有, 如有侵权,请联系我们删除。