linux netstat命令:網路狀態檢視命令

2020-07-16 10:04:34
我們需要先簡單了解一下埠的作用。在網際網路中,如果 IP 地址是 IP 伺服器在網際網路中唯一的地址標識,那麼大家可以想象一下:我有一台伺服器,它有固定的公網 IP 地址,通過 IP 地址可以找到我的伺服器。但是我的伺服器中既啟動了網頁服務(Web 服務),又啟動了檔案傳輸服務(FTP 服務),那麼你的用戶端存取我的伺服器,到底應該如何確定你存取的是哪一個服務呢?

埠就是用於網路通訊的介面,是資料從傳輸層向上傳遞到應用層的資料通道。我們可以理解為每個常規服務都有預設的埠號,通過不同的埠號,我們就可以確定不同的服務。也就是說,用戶端通過 IP 地址存取到我的伺服器,如果封包存取的是 80 埠,則存取的是 Web 服務;而如果封包存取的是 21 埠,則存取的是 FTP 服務。

我們可以簡單地理解為每個常規服務都有一個預設埠(預設埠可以修改),這個埠是所有人都知道的,用戶端可以通過固定的埠存取指定的服務。而我們通過在伺服器中檢視已經開啟的埠號,就可以判斷伺服器中開啟了那些服務。

netstat 是網路狀態檢視命令,既可以檢視到本機開啟的埠,也可以檢視有哪些用戶端連線。netstat 命令的基本資訊如下。
  • 命令名稱:netstat。
  • 英文原意:Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships。
  • 所在路徑:/bin/netstat.
  • 執行許可權:所有使用者。
  • 功能描述:輸出網路連線、路由表、介面統計、偽裝連線和組播成員。

命令格式如下:

[[email protected] ~]# netstat [選項]

選項:
  • -a:列出所有網路狀態,包括 Socket 程式;
  • -c秒數:指定每隔幾秒重新整理一次網路狀態;
  • -n:使用 IP 地址和埠號顯示,不使用域名與服務名;
  • -p:顯示 PID 和程式名;
  • -t:顯示使用 TCP 協定埠的連線狀況;
  • -u:顯示使用 UDP 協定埠的連線狀況;
  • -I:僅顯示監聽狀態的連線;
  • -r:顯示路由表;

【例 1】檢視本機開啟的埠。
這是本機最常用的方式,使用選項"-tuln"。因為使用了"-I"選項,所以只能看到監聽狀態的連線,而不能看到已經連線狀態的連線。例如:

[[email protected] ~]# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp  0  0 0.0.0.0:3306  0.0.0.0:* LISTEN
tcp  0  0 0.0.0.0:11211 0.0.0.0:* LISTEN
tcp  0  0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp  0  0:::11211 :::* LISTEN
tcp  0  0 :::80 :::* LISTEN
tcp  0   0 :::22 :::* LISTEN
udp  0   0 0.0.0.0:11211 0.0.0.0:*
udp  0   0:::11211 :::*
#協定接收佇列傳送佇列本機的 IP 地址及埠號 遠端主機的 IP 地址及埠號 狀態

這個命令的輸出較多。
1) Proto:網路連線的協定,一般就是 TCP 協定或者 UDP 協定。
2) Recv-Q:表示接收到的資料,已經在原生的緩衝中,但是還沒有被進程取走。
3) Send-Q:表示從本機傳送,對方還沒有收到的資料,依然在原生的緩衝中,不具備 ACK 標誌的封包。
4) Local Address:本機的 IP 地址和埠號。
5) ForeignAddress:遠端主機的 IP 地址和埠號。
6) State:狀態。常見的狀態主要有以下幾種。
  • -LISTEN:監聽狀態,只有 TCP 協定需要監聽,而 UDP 協定不需要監聽。
  • -ESTABLISHED:已經建立連線的狀態。如果使用"-I"選項,則看不到已經建立連線的狀態。
  • -SYN_SENT:SYN 發起包,就是主動發起連線的封包。
  • -SYN_RECV:接收到主動連線的封包。
  • -FIN_WAIT1:正在中斷的連線。
  • -FIN_WAIT2:已經中斷的連線,但是正在等待對方主機進行確認。
  • -TIME_WAIT:連線已經中斷,但是通訊端依然在網路中等待結束。
  • -CLOSED:通訊端沒有被使用。

在這些狀態中,我們最常用的就是 LISTEN 和 ESTABLISHED 狀態,一種代表正在監聽,另一種代表已經連線。

【例 2】檢視本機有哪些程式開啟的埠。
如果使用"-p"選項,則可以檢視到是哪個程式佔用了埠,並且可以知道這個程式的 PID。例如:

[[email protected] ~]# netstat -tulnp
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:3306  0.0.0.0:* LISTEN 2359/mysqld
tcp  0  0 0.0.0.0:11211  0.0.0.0:* LISTEN 1563/memcached
tcp  0  0 0.0.0.0:22  0.0.0.0:* LISTEN 1490/sshd
tcp  0  0 :::11211 :::* LISTEN 1563/memcached
tcp  0  0 :::80 :::* LISTEN 21025/httpd
tcp  0  0 :::22 :::*
LISTEN 1490/sshd
udp  0  0 0.0.0.0:11211  0.0.0.0:* 1563/memcached
udp  0  0:::11211 :::* 1563/memcached
#比之前的命令多了一個"-p"選項,結果多了可以知道是哪個程式佔用了埠


【例 3】 檢視所有連線。
使用選項"-an"可以檢視所有連線,包括監聽狀態的連線(LISTEN)、已經建立連線狀態的連線(ESTABLISHED)、Socke 程式連線等。因為連線較多,所以輸出的內容有很多。例如:

[[email protected] ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address  Foreign Address  State
tcp  0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp  0 0 0.0.0.0:11211 0.0.0.0:* LISTEN
tcp  0 0 117.79.130.170:80 78.46.174.55:58815 SYN_RECV
tcp  0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp  0 0 117.79.130.170:22 124.205.129.99:10379 ESTABLISHED
tcp  0 0 117.79.130.170:22 124.205.129.99:11811 ESTABLISHED
...省略部分內容...
udp  0  0 0.0.0.0:11211 0.0.0.0:*
udp  0 0:::11211 :::*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix  2  [ACC]  STREAM  LISTENING  9761  @/var/run/hald/dbus-fr41WkQn1C
…省略部分內容...

從"Active UNIX domain sockets"開始,之後的內容就是 Socke 程式產生的連線,之前的內容都是網路服務產生的連線。我們可以在"-an"選項的輸出中看到各種網路連線狀態,而之前的"-tuln"選項則只能看到監聽狀態。