Netstat简介
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

输出linux系统的网络情况信息,以前面试的时候还被问过:“如何查看占用某个端口的程序的pid?”,这个问题实际用netstat -anp输出,然后再grep一下即可。

*基本格式 netstat [option]

-a 显示所有socket连接

-l 显示监控中(listening)的socket连接

-n 直接使用ip地址,而不使用域名服务器

-p 显示正在使用socket的程序的pid和名称

-r 打印路由表

-t 显示TCP传输协议的连线状况

-u 显示UDP传输协议的连线状况

-s 显示网络工作信息统计表

执行netstat命令,netstat的输出结果可以分为两个部分:

一个是Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指%0A的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。

另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。
Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。

常见参数

-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

TCP连接状态详解

LISTEN: 侦听来自远方的TCP端口的连接请求
SYN-SENT: 再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED: 代表一个打开的连接
FIN-WAIT-1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2: 从远程TCP等待连接中断请求
CLOSE-WAIT: 等待从本地用户发来的连接中断请求
CLOSING: 等待远程TCP对连接中断的确认
LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED: 没有任何连接状态
SYN_RECV表示正在等待处理的请求数;
ESTABLISHED表示正常数据传输状态;
TIME_WAIT表示处理完毕,等待超时结束的请求数。

查看网站并发连接数

比如查看Nginx的并发连接情况,以便我们了解网站的负载情况。

执行以下命令:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

结果:

ESTABLISHED的数量就是当前并发连接数。

访问量统计
很多时候网站会遭遇恶意攻击,我们需要找到出问题的IP进行封杀。
查询访问最频繁的IP

awk '{print $1}' access-2020-04-06.log | sort | uniq -c | sort -n -k 1 -r | more

其他需求

如根据访问IP统计UV

awk '{print $1}'  access-2020-04-06.log | sort | uniq -c | wc -l

1. 列出所有端口 (包括监听和未监听的)

列出所有端口 netstat -a

#netstat -a | more
 Active Internet connections (servers and established)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 localhost:30037         *:*                     LISTEN
 udp        0      0 *:bootpc                *:*
 
Active UNIX domain sockets (servers and established)
 Proto RefCnt Flags       Type       State         I-Node   Path
 unix  2      [ ACC ]     STREAM     LISTENING     6135     /tmp/.X11-unix/X0
 unix  2      [ ACC ]     STREAM     LISTENING     5140     /var/run/acpid.socket

列出所有 tcp 端口 netstat -at

# netstat -at
 Active Internet connections (servers and established)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 localhost:30037         *:*                     LISTEN
 tcp        0      0 localhost:ipp           *:*                     LISTEN
 tcp        0      0 *:smtp                  *:*                     LISTEN
 tcp6       0      0 localhost:ipp           [::]:*                  LISTEN

列出所有 udp 端口 netstat -au

# netstat -au
 Active Internet connections (servers and established)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 udp        0      0 *:bootpc                *:*
 udp        0      0 *:49119                 *:*
 udp        0      0 *:mdns                  *:*

显示程序的pid和名称

netstat -anp 

输出本机路由表

netstat -r

输出监听状态中的tcp协议统计信息

netstat -lts

查看哪些IP连接本机

netstat -an

2. 列出所有处于监听状态的 Sockets

只显示监听端口 netstat -l

#netstat -l
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 localhost:ipp           *:*                     LISTEN
 tcp6       0      0 localhost:ipp           [::]:*                  LISTEN
 udp        0      0 *:49119                 *:*

只列出所有监听 tcp 端口 netstat -lt

# netstat -lt
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 localhost:30037         *:*                     LISTEN
 tcp        0      0 *:smtp                  *:*                     LISTEN
 tcp6       0      0 localhost:ipp           [::]:*                  LISTEN

只列出所有监听 udp 端口 netstat -lu

# netstat -lu
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 udp        0      0 *:49119                 *:*
 udp        0      0 *:mdns                  *:*

只列出所有监听 UNIX 端口 netstat -lx

# netstat -lx
 Active UNIX domain sockets (only servers)
 Proto RefCnt Flags       Type       State         I-Node   Path
 unix  2      [ ACC ]     STREAM     LISTENING     6294     private/maildrop
 unix  2      [ ACC ]     STREAM     LISTENING     6203     public/cleanup
 unix  2      [ ACC ]     STREAM     LISTENING     6302     private/ifmail
  unix  2      [ ACC ]     STREAM     LISTENING     6306     private/bsmtp

显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su

# netstat -st 
# netstat -su

显示所有活动的网络连接

#netstat -na 

3. 在 netstat 输出中显示 PID 和进程名称 netstat -p

netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。

# netstat -pt
 Active Internet connections (w/o servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
 tcp        1      0 ramesh-laptop.loc:47212 192.168.185.75:www        CLOSE_WAIT  2109/firefox
tcp 0 0 ramesh-laptop.loc:52750 lax:www ESTABLISHED 2109/firefox 

4. 找出程序运行的端口

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。

# netstat -ap | grep ssh
 tcp        1      0 dev-db:ssh           101.174.100.22:39213        CLOSE_WAIT  -
 tcp        1      0 dev-db:ssh           101.174.100.22:57643        CLOSE_WAIT  -

找出运行在指定端口的进程

# netstat -an | grep ':80' 

5、linux中如何查询端口被占用的情况

1、lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000
可以看到8000端口已经被轻量级文件系统转发服务lwfs占用;

查看TCP连接数

统计80端口连接数 :

netstat -nat | grep -i "80" | wc -l

统计httpd协议连接数

ps -ef | grep httpd | wc -l

统计已连接上的,状态为“established

netstat -anp | grep ESTABLISHED | wc -l

查出哪个IP地址连接最多,将其封了

netstat -anp | grep ESTABLISHED | awk {print $5}|awk -F: {print $1} | sort | uniq -c | sort -r +0n

netstat -anp | grep SYN | awk {print $5}|awk -F: {print $1} | sort | uniq -c | sort -r +0n

对连接的IP按连接数量进行排序

#netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

查看80端口连接数最多的20个IP

#netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20

查看连接

查找较多time_wait连接

#netstat -n|grep TIME_WAIT|awk '{print $5}' |sort|uniq -c|sort -rn|head -n20

查找较多的SYN连接

#netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

查看同时连接到哪个服务器IP比较多
判断cc攻击,使用双网卡或多网卡可用。

#netstat -an|awk '{print $4}'|sort|uniq -c|sort -nr|head 

查看服务器网络连接数

查看哪些IP连接到服务器连接多
可以查看连接异常IP。

#netstat -an|awk -F: '{print $2}'|sort|uniq -c|sort -nr|head 

显示所有80端口的网络连接并排序
这里的80端口是http端口,所以可以用来监控web服务。如果看到同一个IP有大量连接的话就可以判定单点流量攻击了。

#netstat -an | grep :80 | sort 

查找出当前服务器有多少个活动的 SYNC_REC 连接
正常来说这个值很小,最好小于5。 当有Dos攻击或的时候,这个值相当的高。但是有些并发很高的服务器,这个值确实是很高,因此很高并不能说明一定被攻击。

#netstat -n -p|grep SYN_REC | wc -l 

列出所有连接过的IP地址

#netstat -n -p | grep SYN_REC | sort -u

列出所有发送SYN_REC连接节点的IP地址

#netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'

使用netstat命令计算每个主机连接到本机的连接数

#netstat -ntu | awk ‘{print $5}| cut -d: -f1 | sort | uniq -c | sort -n 

列出所有连接到本机的UDP或者TCP连接的IP数量

#netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

检查 ESTABLISHED 连接并且列出每个IP地址的连接数量

#netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr 

列出所有连接到本机80端口的IP地址和其连接数
80端口一般是用来处理HTTP网页请求。

#netstat -plan|grep :80|awk '{print $5}'|cut -d: -f 1|sort|uniq -c|sort -nk 1

显示连接80 端口前10的ip,并显示每个IP的连接数
这里的80端口是http端口,所以可以用来监控web服务。如果看到同一个IP有大量连接的话就可以判定单点流量攻击了。

#netstat -antp | awk '$4 ~ /:80$/ {print $4" "$5}' | awk '{print $2}'|awk -F : {'print $1'} | uniq -c | sort -nr | head -n 10 

用tcpdump抓包

#tcpdump -i eth0 tcp and port 9000 -C 100 -W 1 -w /tmp/9000.pcap

2、netstat -tunlp |grep 端口号,用于查看指定的端口号的进程情况,如查看8000端口的情况,

netstat -tunlp |grep 8000

说明一下几个参数的含义:

附加一个python端口占用监测的程序,该程序可以监测指定IP的端口是否被占用。
该程序执行结果如下:

6、服务器被攻击常用命令

1,查看80端口连接数:

netstat -nat|grep -i "80" |wc -l

2,对连接的IP按连接数量进行排序:

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

3,用tcpdump嗅探80端口的访问看看谁最高:

tcpdump -i eth0 -tnn dst port 80 -c 1000

4,iptables屏蔽ip:

如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。

屏蔽单个IP的命令是 iptables -I INPUT -s 123.45.6.7 -j DROP
封整个段即从123.0.0.1123.255.255.254的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP
封IP段即从123.45.0.1123.45.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP
封IP段即从123.45.6.1123.45.6.254的命令是 iptables -I INPUT -s 123.45.6.0/24 -j DROP

5,对于web服务器(Nginx、Apache等)来说,并发连接数是一个比较重要的参数,下面就通过netstat命令和awk来查看web服务器的并发连接数以及TCP连接状态。

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(key in S) print key,"\t",S[key]}' FIN_WAIT2 38 CLOSING 3 SYN_RECV 1 CLOSE_WAIT 1 TIME_WAIT 261 ESTABLISHED 71 LAST_ACK 2 FIN_WAIT1 9

参数解释:

CLOSED          无连接是活动的或正在进行 
LISTEN          服务器在等待进入呼叫 
SYN_RECV        一个连接请求已经到达,等待确认 
SYN_SENT        应用已经开始,打开一个连接 
ESTABLISHED     正常数据传输状态/当前并发连接数 
FIN_WAIT1       应用说它已经完成 
FIN_WAIT2       另一边已同意释放 
ITMED_WAIT      等待所有分组死掉 
CLOSING         两边同时尝试关闭 
TIME_WAIT       另一边已初始化一个释放 
LAST_ACK        等待所有分组死掉
ESTABLISHED参数后面的值就是当前系统的并发连接数了。
  1. 在 netstat 输出中显示 PID 和进程名称 netstat -p
    netstat -p 可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。
# netstat -pt
 Active Internet connections (w/o servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
 tcp        1      0 ramesh-laptop.loc:47212 192.168.185.75:www        CLOSE_WAIT  2109/firefox
 tcp        0      0 ramesh-laptop.loc:52750 lax:www ESTABLISHED 2109/firefox
  1. 在 netstat 输出中不显示主机,端口和用户名 (host, port or user)
    当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。

同样可以加速输出,因为不用进行比对查询。

# netstat -an

如果只是不想让这三个名称中的一个被显示,使用以下命令

# netsat -a --numeric-ports
# netsat -a --numeric-hosts
# netsat -a --numeric-users
  1. 持续输出 netstat 信息
    netstat 将每隔一秒输出网络信息。
# netstat -c
 Active Internet connections (w/o servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State
 tcp        0      0 ramesh-laptop.loc:36130 101-101-181-225.ama:www ESTABLISHED
 tcp        1      1 ramesh-laptop.loc:52564 101.11.169.230:www      CLOSING
 tcp        0      0 ramesh-laptop.loc:43758 server-101-101-43-2:www ESTABLISHED
 tcp        1      1 ramesh-laptop.loc:42367 101.101.34.101:www      CLOSING
 ^C
  1. 显示系统不支持的地址族 (Address Families)
netstat --verbose

在输出的末尾,会有如下的信息

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.

9、显示核心路由信息 netstat -r

# netstat -r
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
 192.168.1.0     *               255.255.255.0   U         0 0          0 eth2
 link-local      *               255.255.0.0     U         0 0          0 eth2
 default         192.168.1.1     0.0.0.0         UG        0 0          0 eth2

注意: 使用 netstat -rn 显示数字格式,不查询主机名称。

  1. 找出程序运行的端口
    并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。
# netstat -ap | grep ssh
 tcp        1      0 dev-db:ssh           101.174.100.22:39213        CLOSE_WAIT  -
 tcp        1      0 dev-db:ssh           101.174.100.22:57643        CLOSE_WAIT  -

找出运行在指定端口的进程
查看所有80端口的连接数

# netstat -an | grep ':80'

#netstat -nat|grep -i “80|wc -l
  1. 显示网络接口列表
# 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         0      0      0 0             0      0      0      0 BMU
 eth2       1500 0     26196      0      0 0         26883      6      0      0 BMRU
 lo        16436 0         4      0      0 0             4      0      0      0 LRU

显示详细信息,像是 ifconfig 使用 netstat -ie:

# netstat -ie
 Kernel Interface table
 eth0      Link encap:Ethernet  HWaddr 00:10:40:11:11:11
 UP BROADCAST MULTICAST  MTU:1500  Metric:1
 RX packets:0 errors:0 dropped:0 overruns:0 frame:0
 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000
 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 Memory:f6ae0000-f6b00000
  1. IP和TCP分析
    查看连接某服务端口最多的的IP地址
wss8848@ubuntu:~$ netstat -nat | grep "192.168.1.15:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
18 221.136.168.36
3 154.74.45.242
2 78.173.31.236
2 62.183.207.98
2 192.168.1.14
2 182.48.111.215
2 124.193.219.34
2 119.145.41.2
2 114.255.41.30
1 75.102.11.99

TCP各种状态列表

wss8848@ubuntu:~$ netstat -nat |awk '{print $6}'
established)
Foreign
LISTEN
TIME_WAIT
ESTABLISHED
TIME_WAIT
SYN_SENT

先把状态全都取出来,然后使用uniq -c统计,之后再进行排序。

wss8848@ubuntu:~$ netstat -nat |awk '{print $6}'|sort|uniq -c
143 ESTABLISHED
1 FIN_WAIT1
1 Foreign
1 LAST_ACK
36 LISTEN
6 SYN_SENT
113 TIME_WAIT
1 established)

最后的命令如下:

netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

分析access.log获得访问前10位的ip地址

awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10

13. 查看某个IP地址链接数

问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服务各种连接状态(TIME_WAIT/ CLOSE_WAIT/ ESTABLISHED)的连接数。

参考答案:

netstat -n | grep 1.2.3.4:22 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

netstat -lnpta | grep ssh | egrep “TIME_WAIT | CLOSE_WAIT | ESTABLISHED”

14、从已经备份好的日志中查询数据
问题:从已备份的suyun.2017-06-26.log.bz2日志中,找出包含关键字1.2.3.4的日志有多少条。

参考答案:

bzcat suyun.2017-06-26.log.bz2 | grep '1.2.3.4' | wc -l

bzgrep '1.2.3.4' suyun.2017-06-26.log.bz2 | wc -l

less suyun.2017-06-26.log.bz2 | grep '10.37.9.11' | wc -l

说明:线上日志文件一般以bz2 压缩之后保留,如果解压查询,非常耗空间与时间,bzcat和bzgrep是研发同学必须掌握的工具。

15、备份服务的技巧

问题:打包备份/opt/web/suyun_web目录,排除掉目录中的logs和目录,打包好的文件存放在/opt/backup目录下。
参考答案:

tar -zcvf /opt/backup/shenjian.tar.gz \

    -exclude /opt/web/suyun_web/logs \

    /opt/web/suyun_web

说明:这个命令线上应用较为频繁,在项目需要打包迁移时,常常需要排除掉日志目录,exclude是需要掌握的参数

16、查询线程数

问题:查询服务器运行服务的总线程数,当机器线程数超报警阀值时,能快速查出相关进程及线程信息。

参考答案:

ps -eLf | wc -l

pstree -p | wc -l

17、磁盘报警,清空最大文件

问题:找出服务器上,某个正在运行的tomcat产生的大量异常日志,找出该文件,并释放空间。不妨设该文件包含log关键字,并且大于1G。

参考答案:

第一步,找到该文件

find / -type f -name "*log*" | xargs ls -lSh | more 

du -a / | sort -rn | grep log | more

find / -name '*log*' -size +1000M -exec du -h {} \;

第二步,将文件清空

假设找到的文件为a.log

正确的情况方式应该为:echo “”>a.log,文件空间会立刻释放。

很多同学:rm -rf a.log,这样文件虽然删除,但是因tomcat服务仍在运行,空间不会立刻释放,需要重启tomcat才能将空间释放。

18、显示文件,过滤注释

问题:显示server.conf 文件,屏蔽掉#号开头的注释行

参考答案:

sed -n '/^[#]/!p' server.conf

sed -e '/^#/d' server.conf

grep -v "^#" server.conf

19、磁盘IO异常排查

问题:磁盘IO异常如何排查,类似写入慢或当前使用率较高,请查出导致磁盘IO异常高的进程ID。

参考答案:
第一步:iotop -o 查看当前正在写磁盘操作的所有进程ID信息。

第二步:如果此时各项写入指标都很低,基本没有大的写入操作,则需要排查磁盘自身。可以查看系统dmesg或cat /var/log/message 看看是否有相关的磁盘异常报错,同时可以在写入慢的磁盘上touch 一个空文件看看,是否磁盘故障导致无法写入。

linux下追查线上问题常用命令

20、查占用cpu最多的进程

实际命令:

ps H -eo pid,pcpu | sort -nk2 | tail

执行效果如下:

[work@test01 ~]$ ps H -eo pid,pcpu | sort -nk2 | tail

31396 0.6

31396 0.6

31396 0.6

31396 0.6

31396 0.6

31396 0.6

31396 0.6

31396 0.6

30904 1.0

30914 1.0

结果:

瞧见了吧,最耗cpu的pid=30914(实际上是31396)

方法二:

核心指令:top

实际命令:

top

Shift + t

21、在上面20的基础上,对应的服务名是什么呢

方法一:

核心指令:ps

实际命令:

ps aux | fgrep pid

执行效果如下:

[work@test01 ~]$ ps aux | fgrep 30914

work 30914 1.0 0.8 309568 71668 ? Sl Feb02 124:44 ./router2 –conf=rs.conf

结果:

瞧见了吧,进程是./router2

方法二:

核心指令:…无,直接查proc

实际命令:

ll /proc/pid

执行效果如下:

[work@test01 ~]$ ll /proc/30914

lrwxrwxrwx 1 work work 0 Feb 10 13:27 cwd -> /home/work/im-env/router2

lrwxrwxrwx 1 work work 0 Feb 10 13:27 exe -> /home/work/im-env/router2/router2

结果:

这个好,全路径都出来了

22、查看某个端口的连接情况
方法一:

核心指令:netstat

实际命令:

netstat -lap | fgrep port

执行效果如下:

[work@test01 ~]$ netstat -lap | fgrep 22022

tcp 0 0 10.58.xxx.29:22022 *:* LISTEN 31396/imui

tcp 0 0 10.58.xxx.29:22022 10.58.xxx.29:46642 ESTABLISHED 31396/imui

tcp 0 0 10.58.xxx.29:22022 10.58.xxx.29:46640 ESTABLISHED 31396/imui

方法二:

核心指令:lsof

实际命令:

lsof -i :port

执行效果如下:

[work@test01 ~]$ /usr/sbin/lsof -i :22022

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

router 30904 work 50u IPv4 69065770 TCP 10.58.xxx.29:46638->10.58.xxx.29:22022 (ESTABLISHED)

router 30904 work 51u IPv4 69065772 TCP 10.58.xxx.29:46639->10.58.xxx.29:22022 (ESTABLISHED)

router 30904 work 52u IPv4 69065774 TCP 10.58.xxx.29:46640->10.58.xxx.29:22022 (ESTABLISHED)

23、使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:

答 :

# netstat-n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}

这个命令会输出类似下面的结果:

LAST_ACK16

SYN_RECV348

ESTABLISHED70

FIN_WAIT1229

FIN_WAIT230

CLOSING33

TIME_WAIT18098

我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。

编辑配置文件:/etc/sysctl.conf,在这个文件中,加入下面的几行内容:

# vim /etc/sysctl.conf

net.ipv4.tcp_syncookies= 1

net.ipv4.tcp_tw_reuse= 1

net.ipv4.tcp_tw_recycle= 1

net.ipv4.tcp_fin_timeout= 30

输入下面的命令,让内核参数生效:

# sysctl-p

简单的说明上面的参数的含义:

net.ipv4.tcp_syncookies= 1

表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse= 1

表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle= 1

表示开启TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭;

net.ipv4.tcp_fin_timeout

修改系統默认的TIMEOUT 时间。

在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击。

此外,如果你的连接数本身就很多,我们可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:

net.ipv4.tcp_keepalive_time= 1200

net.ipv4.ip_local_port_range= 1024 65535

net.ipv4.tcp_max_syn_backlog= 8192

net.ipv4.tcp_max_tw_buckets= 5000

这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。

net.ipv4.tcp_keepalive_time= 1200

表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

ip_local_port_range= 1024 65535

表示用于向外连接的端口范围。缺省情况下很小,改为1024到65535。

net.ipv4.tcp_max_syn_backlog= 8192

表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets= 5000

表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000,改为5000。此项参数可以控制TIME_WAIT的最大数量,只要超出了。

24、查看Apache当前并发访问数:

netstat -anp | grep ESTABLISHED | wc -l

查看有多少个进程数:

ps aux | grep httpd | wc -l

查看数据

#ps -ef | grep httpd | wc -l
1388

统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。

表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整。

#netstat -ant | grep -i "80" | wc -l
4341

netstat -an会打印系统当前网络链接状态,而grep -i "80"是用来提取与80端口有关的连接的,wc -l进行连接数统计。最终返回的数字就是当前所有80端口的请求总数。

#netstat -anp | grep ESTABLISHED | wc -l
376

netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计。最终返回的数字就是当前所有80端口的已建立连接的总数。

查看当前的连接数可以用:

ps aux | grep httpd | wc -l 或 pgrep httpd|wc -l

计算httpd占用内存的平均数:

ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'

实时检测httpd连接数:

watch -n 1 -d "pgrep httpd|wc -l"

查看Apache的并发请求数及其TCP连接状态:

#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 8947 等待足够的时间以确保远程TCP接收到连接中断请求的确认
FIN_WAIT1 15 等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN_WAIT2 1 从远程TCP等待连接中断请求
ESTABLISHED 55 代表一个打开的连接
SYN_RECV 21 再收到和发送一个连接请求后等待对方对连接请求的确认
CLOSING 2 没有任何连接状态
LAST_ACK 4 等待原来的发向远程TCP的连接中断请求的确认

25、查看某个端口链接状态的连接数

#netstat -nlap | grep -i est | grep -i 6379 | awk '{print $4}'

#netstat -nlap | grep -i est | grep -i 1121 | wc -l

平时使用总结,使用此命令如果实在记不住后面参数有哪些,那么直接记住为:-nlap 即可,大部分情况都可以满足我们的需求

netstat常见参数如下:

-a (all)显示所有选项,默认不显示LISTEN相关

-t (tcp)仅显示tcp相关选项

-u (udp)仅显示udp相关选项

-n 拒绝显示别名,能显示数字的全部转化成数字。

-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名

-r 显示路由信息,路由表

-e 显示扩展信息,例如uid等

-s 按各个协议进行统计

-c 每隔一个固定时间,执行该netstat命令。

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

26、head到仅显示前 15 行输出:

$ netstat --all | head -n 15
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:27036                 *:*                     LISTEN      
tcp        0      0 localhost:27060         *:*                     LISTEN      
tcp        0      0 *:16001                 *:*                     LISTEN      
tcp        0      0 localhost:6463          *:*                     LISTEN      
tcp        0      0 *:ssh                   *:*                     LISTEN      
tcp        0      0 localhost:57343         *:*                     LISTEN      
tcp        0      0 *:ipp                   *:*                     LISTEN      
tcp        0      0 *:4713                  *:*                     LISTEN      
tcp        0      0 10.0.1.222:48388        syd15s17-in-f5.1e:https ESTABLISHED
tcp        0      0 10.0.1.222:48194        ec2-35-86-38-2.us:https ESTABLISHED
tcp        0      0 10.0.1.222:56075        103-10-125-164.va:27024 ESTABLISHED
tcp        0      0 10.0.1.222:46680        syd15s20-in-f10.1:https ESTABLISHED
tcp        0      0 10.0.1.222:52730        syd09s23-in-f3.1e:https ESTABLISHED

要仅显示 TCP 端口,请使用–alland–tcp选项,或者-at简称:

$ netstat -at | head -n 5
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address   Foreign Address  State      
tcp        0      0 *:27036         *:*              LISTEN      
tcp        0      0 localhost:27060 *:*              LISTEN      
tcp        0      0 *:16001         *:*              LISTEN

要仅显示 UDP 端口,请使用–alland–udp选项,或-au简称:

$ netstat -au | head -n 5
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address    State      
udp        0      0 *:27036           *:*                                
udp        0      0 10.0.1.222:44741  224.0.0.56:46164   ESTABLISHED
udp        0      0 *:bootpc          

netstat 的选项通常很直观。例如,要显示具有进程 ID (PID) 和数字地址的所有侦听 TCP 和 UDP 端口:

$ sudo netstat --tcp --udp --listening --programs --numeric
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address      Foreign Addr  State   PID/Program name    
tcp        0      0 0.0.0.0:111        0.0.0.0:*     LISTEN  1/systemd            
tcp        0      0 192.168.122.1:53   0.0.0.0:*     LISTEN  2500/dnsmasq        
tcp        0      0 0.0.0.0:22         0.0.0.0:*     LISTEN  1726/sshd            
tcp        0      0 127.0.0.1:631      0.0.0.0:*     LISTEN  1721/cupsd          
tcp        0      0 127.0.0.1:6010     0.0.0.0:*     LISTEN  4023/sshd: tux@  
tcp6       0      0 :::111             :::*          LISTEN  1/systemd            
tcp6       0      0 :::22              :::*          LISTEN  1726/sshd            
tcp6       0      0 ::1:631            :::*          LISTEN  1721/cupsd          
tcp6       0      0 ::1:6010           :::*          LISTEN  4023/sshd: tux@  
udp        0      0 0.0.0.0:40514      0.0.0.0:*             1499/avahi-daemon:  
udp        0      0 192.168.122.1:53   0.0.0.0:*             2500/dnsmasq        

这种常见组合的简短版本是-tulpn.

要显示有关特定服务的信息,请使用以下内容进行过滤grep:

$ sudo netstat -anlp | grep cups
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1721/cupsd           tcp6       0      0 ::1:631                 :::*                    LISTEN      1721/cupsd
unix  2      [ ACC ]     STREAM     LISTENING     27251    1/systemd /var/run/cups/cups.sock
unix  2      [ ]         DGRAM                    59530    1721/cupsd
unix  3      [ ]         STREAM     CONNECTED     55196    1721/cupsd /var/run/cups/cups.sock

下一步
运行该netstat命令后,您可以通过确保只有您积极使用的服务在您的网络上侦听来采取措施保护您的系统。

  1. 识别常用的端口和服务。作为一般规则,请关闭您实际上不使用的端口。
  2. 注意不常见的端口号,并学会识别系统上正在使用的合法端口。
  3. 密切注意 SELinux 错误。有时您需要做的只是更新上下文以匹配您对系统所做的
    合法更改,但请阅读错误以确保 SELinux 不会提醒您可疑或恶意活动。

如果您发现某个端口正在运行可疑服务,或者您只是想关闭不再使用的端口,您可以按照以下步骤通过防火墙规则手动拒绝端口访问:

如果您正在使用firewall-cmd,请运行以下命令:

$ sudo firewall-cmd –remove-port=<port number>/tcp
$ sudo firewall-cmd –runtime-to-permanent

如果您使用的是 UFW,请运行以下命令:

$ sudo ufw deny <port number>

27、

28、

29、

30、

参考链接 :

https://www.cnblogs.com/itech/archive/2012/09/09/2678041.html

https://mp.weixin.qq.com/s/OSN14MFsznIE851ypvQE0A

作者:iTech
出处:http://itech.cnblogs.com/

作者:流水莫须
链接https://www.jianshu.com/p/d9fe6be01667
來源:简书

岂止于ping-18个必备Linux网络连接命令,助你掌控黑客行踪! :http://www.safebase.cn/article-256713-1.html

使用 netstat 查看 Linux 服务器的网络连接
https://mp.weixin.qq.com/s/O3Rq0cBiJSuCkUs6fAhACQ

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐