Linux的netstat命令使用

Netstat簡介 

Netstat 命令用於顯示各類網絡相關信息,如網絡鏈接,路由表,接口狀態 (Interface Statistics),masquerade 鏈接,多播成員 (Multicast Memberships) 等等。html

輸出linux系統的網絡狀況信息,之前面試的時候還被問過:「如何查看佔用某個端口的程序的pid?」,這個問題實際用netstat -anp輸出,而後再grep一下便可。python

基本格式 netstat [option]

  • -a 顯示全部socket鏈接linux

  • -l 顯示監控中(listening)的socket鏈接nginx

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

  • -p 顯示正在使用socket的程序的pid和名稱github

  • -r 打印路由表web

  • -t 顯示TCP傳輸協議的連線情況面試

  • -u 顯示UDP傳輸協議的連線情況ubuntu

  • -s 顯示網絡工做信息統計表vim

執行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:偵聽來自遠方的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:沒有任何鏈接狀態

 

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

案例 : 

        一般使用「-anpt」組合選項,以數字形式顯示當前系統中全部的TCP鏈接信息,同事顯示對應的進程信息。結合管道使用「grep」命令,過濾出所須要的特定記錄

[root@localhost ~]# netstat -anpt | grep ":22"
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1367/sshd           
tcp        0     64 192.168.231.131:22          192.168.231.1:60782         ESTABLISHED 33595/sshd          
tcp        0      0 :::22                       :::*                        LISTEN      1367/sshd           

 

測試網絡鏈接

統計httpd進程數,連個請求會啓動一個進程,使用於Apache服務器。表示Apache可以處理1388個併發請求,這個值Apache可根據負載狀況自動調整

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

netstat -an會打印系統當前網絡連接狀態,而grep -i 「80」是用來提取與80端口有關的鏈接的,wc -l進行鏈接數統計。最終返回的數字就是當前全部80端口的請求總數

netstat -na|grep ESTABLISHED|wc -l 376

netstat -an會打印系統當前網絡連接狀態,而grep ESTABLISHED 提取出已創建鏈接的信息。 而後wc -l統計最終返回的數字就是當前全部80端口的已創建鏈接的總數。

netstat -nat | grep ESTABLISHED|wc

輸出每一個ip的鏈接數,以及總的各個狀態的鏈接數

netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s", a, S[a]);++I}printf("%-20s %s","TOTAL_IP",I);for(a in s) printf("%-20s %s",a, s[a]);printf("%-20s %s","TOTAL_LINK",N);}'

查看當前主機正在監聽的端口

#netstat -an | grep LISTEN

查看Tcpip併發鏈接數以及這個 端口對外的鏈接

# netstat -nao |more

跑WEB 你就用iftop看下 訪問進來的IP

yum install libpcap  進行安裝

#nethogs eth0

DEV列顯示設備名,SEND是服務器發送的流量,RECEIVED服務器接收的流量。 // 按 m 能夠切換統計方式  : 流量速度KB/sec  或 總數{KB /B /m}

 

查看服務器當前的併發訪問量

統計服務器全部url被請求的數量

netstat -pnt | grep :80 | wc -l

 

1. 列出全部端口 (包括監聽和未監聽的)

#netstat -na
顯示出全部處於監聽狀態的應用程序及進程號和端口號:

#netstat -aultnp
若是想對一個單一的進行查詢,只須要在命令後面再加上「| grep $」。這裏就用到了管道符,以及grep篩選命令,$表明參數,也就是你要查詢的那個。

 

顯示全部80端口的網絡鏈接:

#netstat -aultnp | grep 80

對返回的鏈接列表進行排序,這就要用到sort命令了,命令以下:

#netstat -aultnp | grep :80 | sort

使用netstat 命令來找到運行在這個端口上的進程

# netstat -tunp | grep 22

進行統計的話,就能夠再日後面加wc命令。如:

#netstat -aultnp | grep :80 | wc -l

使用lsof 命令來找到運行在該端口的進程

# lsof -i:22

使用和iptraf 相似的工具iftop ,來找出流量從哪些端口發送出去的。

# iftop -P

查看端口以及服務,收發的流量。

#jnettop

查找出當前服務器有多少個活動的 SYNC_REC 鏈接。正常來講這個值很小,最好小於5。 當有Dos攻擊或者郵件炸彈的時候,這個值至關的高。儘管如此,這個值和系統有很大關係,有的服務器值就很高,也是正常現象。

#netstat -n -p | grep SYN_REC | sort -u
列出全部鏈接過的IP地址。

 

#netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
列出全部發送SYN_REC鏈接節點的IP地址。

 

查看服務器併發鏈接全部狀態的命令

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

狀態:描述 
CLOSED:      無鏈接是活動的或正在進行 
LISTEN:        服務器在等待進入呼叫 
SYN_RECV:   一個鏈接請求已經到達,等待確認 
SYN_SENT:   應用已經開始,打開一個鏈接 
ESTABLISHED:     正常數據傳輸狀態 
FIN_WAIT1:         應用說它已經完成 
FIN_WAIT2:         另外一邊已贊成釋放 
ITMED_WAIT:      等待全部分組死掉 
CLOSING:    兩邊同時嘗試關閉 
TIME_WAIT:      另外一邊已初始化一個釋放 
LAST_ACK:        等待全部分組死掉
 

#netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
使用netstat命令計算每一個主機鏈接到本機的鏈接數。

#netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
列出全部鏈接到本機的UDP或者TCP鏈接的IP數量。

 

#netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
檢查 ESTABLISHED 鏈接而且列出每一個IP地址的鏈接數量。

 

#netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
列出全部鏈接到本機80端口的IP地址和其鏈接數。80端口通常是用來處理HTTP網頁請求。

 

       經過防火牆規則,添加一個規則拒接這個假IP的網段鏈接。

例如:

#iptables -A INPUT 1 -s $IPADRESS -j DROP/REJECT
      注意,你需將$IPADRESS 替換成須要拒絕鏈接的IP地址。執行完iptables 後呢,要重啓一下web服務。

 

  列出全部端口 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

查看631端口

[root@localhost ~]# netstat -anpt | grep 631
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1218/cupsd 
tcp 0 0 ::1:631 :::* LISTEN 1218/cupsd

 

查看鏈接你服務器 top10 用戶端的 IP 地址:

netstat -nat | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c | sort -rn | head -n 10

 

  列出全部 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                  *:*

 

查看Web服務器(Nginx Apache)的併發請求數及其TCP鏈接狀態

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

netstat -n|grep  ^tcp|awk '{print $NF}'|sort -nr|uniq -c

 

查看服務器還在創建鏈接的命令

#netstat -nat|grep ESTABLISHED|wc -l

查看某個端口號的併發鏈接數

# netstat -antp | grep 8080 | grep ESTABLISHED -c

netstat -na | grep ESTAB | grep 8080 | wc -l //統計tomcat併發鏈接數;

 

查看nginx或者tomcat tcp鏈接

netstat -nat|grep 80

 

顯示程序的pid和名稱 

netstat -anp 

輸出本機路由表

netstat -r

輸出監聽狀態中的tcp協議統計信息

netstat -lts

 

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

 

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' 

 

netcat

nc -vv IP 端口號:意思是隻顯示該 IP 地址的某端口是否處於正常狀態(succeeded:成功,Connection refused:鏈接拒絕)

nc -z IP 端口號; echo $?:意思是判斷該 IP 地址的某端口是否有誤(0:無誤,1:有誤)

[root@localhost ~]# nc -vv 192.168.1.127 22
Connection to 192.168.1.127 22 port [tcp/ssh] succeeded!
SSH-2.0-OpenSSH_5.3
[root@localhost ~]# nc -z 192.168.1.127 22; echo $?
Connection to 192.168.1.127 22 port [tcp/ssh] succeeded!
0
[root@localhost ~]# nc -vv 192.168.1.127 3306
nc: connect to 192.168.1.127 port 3306 (tcp) failed: Connection refused

    lsof

lsof 查看端口占用語法格式:lsof -i :端口號

 

[root@localhost ~]# lsof -i:631
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cupsd 1218 root 6u IPv6 12257 0t0 TCP localhost:ipp (LISTEN)
cupsd 1218 root 7u IPv4 12258 0t0 TCP localhost:ipp (LISTEN)
cupsd 1218 root 9u IPv4 12261 0t0 UDP *:ipp

端口掃描工具

nmap 127.0.0.1 不加任何參數將以默認的方式掃描 127.0.0.1 主機的開放端口和服務名稱。

使用 -sT 參數嘗試同目標主機的每一個 TCP 端口創建鏈接、觀察有哪些端口處於開放狀態以及所運行的有哪些服務;

 

例如:掃描 GitHub 網站,看看存在哪些開放的端口。

[root@localhost ~]# nmap -sT www.github.com

Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:24 CST
Nmap scan report for www.github.com (52.74.223.119)
Host is up (0.15s latency).
rDNS record for 52.74.223.119: ec2-52-74-223-119.ap-southeast-1.compute.amazonaws.com
Not shown: 996 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
9418/tcp open git

Nmap done: 1 IP address (1 host up) scanned in 70.72 seconds

掃描指定的 IP ,看看存在哪些開放的端口。

 

[root@localhost ~]# nmap -sT 220.181.38.150

Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:40 CST
Nmap scan report for 220.181.38.150
Host is up (0.0056s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
443/tcp open https

Nmap done: 1 IP address (1 host up) scanned in 4.64 seconds
  • -O 參數:探測主機操做系統;

  • -sV 參數:探測端口上運行的軟件;

 

經過上述兩項參數,結合在一塊兒,掃描 baidu 網站主機操做系統和掃描出的端口上運行着什麼軟件?

 

掃描後,咱們能夠看出端口號爲:80 和 443 所運行着 Microsoft Windows UPnP(微軟視窗)的軟件

[root@localhost ~]# sudo nmap -O -sV www.baidu.com

Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:32 CST
Nmap scan report for www.baidu.com (220.181.38.150)
Host is up (0.015s latency).
Other addresses for www.baidu.com (not scanned): 220.181.38.149
Not shown: 998 filtered ports
PORT STATE SERVICE VERSION
80/tcp open upnp Microsoft Windows UPnP
443/tcp open ssl/upnp Microsoft Windows UPnP
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: switch
Running: HP embedded
OS details: HP 4000M ProCurve switch (J4121A)
Service Info: OS: Windows

OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 22.87 seconds

 

經過上述掃描域名的方式之外,也能夠採用 IP 的方式來進行掃描指定主機的操做系統和端口上所運行的軟件;

[root@localhost ~]# sudo nmap -O -sV 220.181.38.150

Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:35 CST
Nmap scan report for 220.181.38.150
Host is up (0.015s latency).
Not shown: 998 filtered ports
PORT STATE SERVICE VERSION
80/tcp open upnp Microsoft Windows UPnP
443/tcp open ssl/upnp Microsoft Windows UPnP
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: switch
Running (JUST GUESSING): HP embedded (86%)
Aggressive OS guesses: HP 4000M ProCurve switch (J4121A) (86%)
No exact OS matches for host (test conditions non-ideal).
Service Info: OS: Windows

OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.82 seconds

 

  • -sS 參數:經過向目標的某一個端口發送 TCP SYN 包,而後根據對方不一樣的迴應來判斷該端口是否處於監聽狀態。

[root@localhost ~]# nmap -sS www.github.com

Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-28 05:03 CST
Nmap scan report for www.github.com (13.229.188.59)
Host is up (0.15s latency).
rDNS record for 13.229.188.59: ec2-13-229-188-59.ap-southeast-1.compute.amazonaws.com
Not shown: 996 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
9418/tcp open git

Nmap done: 1 IP address (1 host up) scanned in 32.39 seconds

 

  • -sA 參數是 TCP ACK 掃描,只用來肯定防火牆的規則集,自己並不掃描目標主機的端口。

[root@localhost ~]# nmap -sA www.newrank.cn

Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-28 05:25 CST
Nmap scan report for www.newrank.cn (47.99.2.204)
Host is up (0.029s latency).
All 1000 scanned ports on www.newrank.cn (47.99.2.204) are filtered

Nmap done: 1 IP address (1 host up) scanned in 17.63 seconds

 

  • -sW 參數相似於 TCP ACK 掃描,能夠檢測處處於打開狀態的端口。

[root@localhost ~]# nmap -sW www.newrank.cn

Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-28 05:55 CST
Nmap scan report for www.newrank.cn (47.99.2.204)
Host is up (0.032s latency).
All 1000 scanned ports on www.newrank.cn (47.99.2.204) are filtered

Nmap done: 1 IP address (1 host up) scanned in 46.43 seconds

 

  • -PN 參數是強制 nmap 對這類主機進行掃描。

[root@localhost ~]# nmap -sT -PN 220.181.38.150

Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:41 CST
Nmap scan report for 220.181.38.150
Host is up (0.0053s latency).
Not shown: 998 filtered ports
PORT STATE SERVICE
80/tcp open http
443/tcp open https

Nmap done: 1 IP address (1 host up) scanned in 4.00 seconds

 

[root@localhost ~]# nmap -sT -PN -p1-5000 192.168.1.127

Starting Nmap 5.51 ( http://nmap.org ) at 2019-05-27 10:51 CST
Nmap scan report for 192.168.1.127
Host is up (0.00058s latency).
Not shown: 4998 closed ports
PORT STATE SERVICE
22/tcp open ssh
111/tcp open rpcbind

Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds

 

除上述參數以外,還有一些不經常使用的參數。

 

例如:

  • -sF:向目標發送 TCP FIN 包,根據目標的響應進行判斷;

[root@localhost ~]# nmap -sF www.newrank.cn

 

  • -sX:向目標發送 TCP NULL 包,根據目標的響應進行判斷;

[root@localhost ~]# nmap -sX www.newrank.cn

 

  • -sN:向目標發送 FIN、PSH、URG 的包,根據目標的響應進行判斷;

[root@localhost ~]# nmap -sN www.newrank.cn

 

  • -sR:用於確認是不是 RPC 端口;

[root@localhost ~]# nmap -sR www.newrank.cn

 

  • -sU:確認哪些是 UDP 端口處於開放的;

[root@localhost ~]# nmap -sU www.newrank.cn

 

  • -sP:向目標發送 TCP ACK 的包,若是有響應,則代表目標處於活動狀態;

[root@localhost ~]# nmap -sP www.newrank.cn

 

五、linux中如何查詢端口被佔用的狀況

 

一、lsof -i:端口號 用於查看某一端口的佔用狀況,好比查看8000端口使用狀況,lsof -i:8000

能夠看到8000端口已經被輕量級文件系統轉發服務lwfs佔用

 

二、netstat -tunlp |grep 端口號,用於查看指定的端口號的進程狀況,如查看8000端口的狀況,netstat -tunlp |grep 8000

說明一下幾個參數的含義:

附加一個python端口占用監測的程序,該程序能夠監測指定IP的端口是否被佔用。

該程序執行結果以下:

六、服務器被攻擊經常使用命令

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的話「三、開放指定的端口」能夠直接跳過。
  • 屏蔽單個IP的命令是 iptables -I INPUT -s 123.45.6.7 -j DROP
  • 封整個段即從123.0.0.1到123.255.255.254的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP
  • 封IP段即從123.45.0.1到123.45.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP
  • 封IP段即從123.45.6.1到123.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參數後面的值就是當前系統的併發鏈接數了。

 

6. 在 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

 

7. 在 netstat 輸出中不顯示主機,端口和用戶名 (host, port or user)

當你不想讓主機,端口和用戶名顯示,使用 netstat -n。將會使用數字代替那些名稱。

一樣能夠加速輸出,由於不用進行比對查詢。

# netstat -an

若是隻是不想讓這三個名稱中的一個被顯示,使用如下命令

# netsat -a --numeric-ports
# netsat -a --numeric-hosts
# netsat -a --numeric-users

 

8. 持續輸出 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

8. 顯示系統不支持的地址族 (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.

九、顯示核心路由信息 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 顯示數字格式,不查詢主機名稱。

10. 找出程序運行的端口

並非全部的進程都能找到,沒有權限的會不顯示,使用 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'

 

11. 顯示網絡接口列表

# 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

 

12. 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」

 

1四、從已經備份好的日誌中查詢數據

問題:從已備份的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是研發同窗必須掌握的工具。

 

1五、備份服務的技巧                          

問題:打包備份/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是須要掌握的參數

 

1六、查詢線程數                           

問題:查詢服務器運行服務的總線程數,當機器線程數超報警閥值時,能快速查出相關進程及線程信息。

 

參考答案

  • ps -eLf | wc -l

  • pstree -p | wc -l

 

1七、磁盤報警,清空最大文件               

問題:找出服務器上,某個正在運行的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才能將空間釋放。

 

1八、顯示文件,過濾註釋

問題:顯示server.conf 文件,屏蔽掉#號開頭的註釋行

 

參考答案

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

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

  • grep -v "^#" server.conf

 

1九、磁盤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

 

2一、在上面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

結果:

這個好,全路徑都出來了

 

2二、查看某個端口的鏈接狀況

方法一:

核心指令: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)

 

 

2三、使用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的最大數量,只要超出了。

 

2四、

 

 

2五、

 

2六、

 

 

2七、

 

 

2八、

 

 

2九、

 

 

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 來源:簡書

相關文章
相關標籤/搜索