[TOC]

0x00 快速入门

前言:主要针对于Linux中网络信息/TCP/UDP连接查看抓取等命令进行学习,加深对Linux的使用;

0x01 网络状态信息

netstat 命令

描述:用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况

WeiyiGeek.netstat选项

WeiyiGeek.netstat选项

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#示例1.利用管道符的命令连接可以看当前与多少用户正在连接
netstat -an | grep ESTABLISHED | wc -l
netstat -tnul ##可以用来看有多少端口服务正常打开
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN


#示例2.查询通信TCP/UDP协议
netstat -antup #查看网络的链接信息,显示建立相关链接的程序名,显示所有选项,拒绝显示别名,能显示数字的全部转化成数字,显示tcp和udp
netstat -tlunp #列出所有得tcp/udp正在连接得通信 进程得PID
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:80 0.0.0.0:* LISTEN 11108/nginx: master


#示例3.使用prot/host和users显示
$netstat -a --numeric-ports | head -n 4
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

$netstat -a --numeric-hosts | head -n 4
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN

$netstat -a --numeric-users | head -n 4
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN


#示例4.列出所有处于监听状态得Sockets
$netstat -lx #只列出监听 UNIX 端口 STREAM:流
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 18174 /run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 327430 /var/run/docker.sock


#示例5.显示每个协议得统计信息进行持续输出 - passive:被动
netstat -cstu #每秒钟刷新统计信息
# IcmpMsg:
# InType0: 3
# InType3: 2469
# InType8: 37438
# InType11: 986
# InType13: 12
# OutType0: 37438
# OutType3: 2
# OutType14: 12
# Tcp:
# 442 active connections openings
# 4122 passive connection openings
# 20172 failed connection attempts
# 221 connection resets received
# 6 connections established
# 1141594 segments received
# 1316330 segments send out
# 231198 segments retransmited
# 5 bad segments received.
# 670914 resets sent
# InCsumErrors: 4
# Udp:
# 17621 packets received
# 2 packets to unknown port received.
# 0 packet receive errors
# 52001 packets sent
# 0 receive buffer errors
# 0 send buffer errors


#示例6.显示系统不支持得地址族(Address Families)
$netstat --verbose
netstat: no support for AF INET (sctp) on this system.
netstat: no support for AF IPX on this system.
netstat: no support for AF AX25 on this system.
netstat: no support for AF X25 on this system.
netstat: no support for AF NETROM on this system.


#示例6.显示核心路由信息
$netstat -ri
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
default gateway 0.0.0.0 UG 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 0 0 0 eth0


#示例7.显示网络接口列表
$netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
br-15352d6a83b9 1500 0 0 0 0 0 0 0 0 BMU
br-523a7e9f1e05 1500 38 0 0 0 38 0 0 0 BMU
docker0 1500 35908 0 0 0 37440 0 0 0 BMU
eth0 1500 1667387 0 0 0 1456021 0 0 0 BMRU
lo 65536 38 0 0 0 38 0 0 0 LRU

#示例8.IP/TCP分析
$netstat -pantu | egrep -v '0.0.0.0|::::'| awk '{print $5}'| egrep -v 'and|Address' | cut -d ':' -f 1 | sort | uniq
218.201.8.36

$netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk '/^tcp/{++state[$NF]} END {for(i in state) print i,"\t",state[i]}'
SYN_RECV 4
ESTABLISHED 8

WeiyiGeek.分析IP/TCP

WeiyiGeek.分析IP/TCP

Q:[面试]Linux 下查看端口占用的命令?

答: netstat -tunlp 、ss -tua、lsof -i 等命令


ss 命令 - 显示系统网络socket连接以及端口信息

描述:显示处于活动状态的套接字信息,它是 iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息,它可以显示和netstat类似的内容,但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,当服务器维持的连接达到上万个的时候,使用netstat等于浪费生命,而用ss才是节省时间。

ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。当然如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢。

基础语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Usage: ss [ OPTIONS ]
ss [ OPTIONS ] [ FILTER ]
# 参数
-r:尝试解析数字地址/端口
-e:处于通信状态,ESTABLISHED
-p:显示进程服务与PID号
-K: 强制关闭 socket

# 状态说明
states: established, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, close-wait, last-ack, listen and closing.

# 命令
all - for all the states
connected - all the states except for listen and closed
synchronized - all the connected states except for syn-sent
bucket - states, which are maintained as minisockets, i.e. time-wait and syn-recv
big - opposite to bucket

WeiyiGeek.参数

WeiyiGeek.参数

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#示例1.显示指定状态和服务得数据连接
ss state ESTABLISHED sport = :ssh
Netid Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp 0 0 172.17.24.236:ssh 218.201.8.36:38532
tcp 0 0 172.17.24.236:ssh 218.201.8.36:nifty-hmi
## 展现其强大的过滤能力
$ ss state all sport = :ssh ##源端口就是:ssh,也可以是:22
$ ss state connected sport = :ssh ##只有ESTABLISHED,同样也能是22端口


#示例2.显示连接的时间
ss -o | grep -v "*" | grep "timer" ## 连接 时间
tcp ESTAB 0 0 172.17.24.236:ssh 218.201.8.36:38532 timer:(keepalive,98min,0)


#示例3.显示TCP/UDP/.X连接
ss -tua #列举出所有的TCP/UDP连接
ss -tux
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 /run/systemd/journal/stdout 438875 * 438870
tcp ESTAB 0 0 172.17.24.236:ssh 218.201.8.36:8924


#示例4.显示Sockets摘要
ss -s
Total: 141 (kernel 192) #总数
TCP: 12 (estab 10, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 192 - -
RAW 0 0 0
UDP 9 8 1
TCP 12 12 0
INET 21 20 1
FRAG 0 0 0


#示例5.列出所有打开的网络连接端口
ss -l #UNCONN TCP /UDP /UNIX -l 参数只会显示监听的端口,而且可以进一步过滤到任何想要的信息。
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN 0 0 rtnl:dockerd/7461 *
nl UNCONN 0 0 rtnl:kernel *


#示例6.查看进程使用的socket
ss -m ##显示内存使用套接字
# u_str ESTAB 0 0 /run/dbus/system_bus_socket 443118 * 443110 skmem:(r0,rb212992,t0,tb212992,f0,w0,o0,bl0,d0)

ss -pl
ss -pl | grep "tcp" | awk 'BEGIN{ FS=" "}{print $1,$2,$5}' # 截取字段
# udp UNCONN 0 0 192.168.1.254:ntp *:* users:(("ntpd",pid=2497,fd=24))
# udp UNCONN 0 0 127.0.0.1:ntp *:* users:(("ntpd",pid=2497,fd=22))
# nl UNCONN tcpdiag:ss/29225
# nl UNCONN tcpdiag:kernel
# tcp LISTEN *:http
# tcp LISTEN *:ssh


#示例7.可以列出过滤出指定的 host 或者 ip 段,Destination(目标地址)
$ ss state all dst 74.125.0.0/16 ## 例如,列出到达 74.125.0.0/16 子网的连接,这个子网属于 Google:

WeiyiGeek.state

WeiyiGeek.state


0x02 网络连接配置

wpa_supplicant 命令

描述:Linux 系统的笔记本电脑有外置的WIFI模块即可;

1
2
#实例1.连接无线网ssid/密码psk/wlp4s0网卡名称
wpa_supplicant -B -i wlp4s0 -c <(wpa_passphrase "NAMEssid" "psk")


nload 命令

描述: 是一个实时监控网络流量和带宽使用的控制台应用程序,使用两个图表可视化地展示接收和发送的流量,并提供诸如数据交换总量、最小/最大网络带宽使用量等附加信息。

1
2
3
4
5
#RHEL/CentOS
yum install nload

#Debian/Ubuntu
apt install nload

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1.利用回车切换不同的网卡
Device eth0 [172.31.0.25] (1/2):
============================================================
Incoming:
Curr: 1.63 kBit/s
Avg: 2.02 kBit/s
Min: 888.00 Bit/s
Max: 12.65 kBit/s
Ttl: 29.57 GByte
Outgoing:
Curr: 2.88 kBit/s
Avg: 3.43 kBit/s
Min: 1.43 kBit/s
Max: 14.81 kBit/s
Ttl: 17.75 GByte