繼linux命令之後,我又給你們整理了網路命令歸納,快給我來收藏

beiyou_linux 發表於 2020-11-27

前言

上次發了linux命令總結之後,很多朋友說想看網路命令歸納總結,今天他來了,別廢話,給我收藏起來。

推薦一下自己的linuxC/C++交流群:973961276!整理了一些個人覺得比較好的學習書籍、視訊資料以及大廠面經視訊共享在群檔案裡面,有需要的小夥伴可以自行新增哦!~

網路連通性檢測

當應用出現網路異常時,首先需要確認的就是網路的連通性是否正常,下面一組命令可快速檢測網路的連通性,如下:
檢測DNS

dig www.baidu.combash
nslookup www.baidu.combash
host www.baidu.com

檢測主機是否可達

ping www.baidu.com

檢測port是否可達

#檢查tcp埠
telnet www.baidu.com 80
#檢查udp埠
nc -uvz ip port

檢測SSL
SSL認證也經常導致程式無法連線,主要出現在SSL握手過程中。

openssl s_client -connect www.baidu.com:443 -prexit

一鍵檢測
多數情況下,可以使用curl一鍵檢測所有過程,如果有問題,再使用上面的命令逐個排查。

curl -v http://www.baidu.com:80/

時間消耗分佈
使用curl可檢測出http協議介面各階段花費的時間。

$ curl -o /dev/null -s -w " time_namelookup:%{time_namelookup}s\n time_connect:%{time_connect}s\n time_starttransfer:%{time_starttransfer}s\n time_total:%{time_total}s\n speed_download:%{speed_download}\n http_code:%{http_code}" "http://www.baidu.com"
 time_namelookup:0.016542s
 time_connect:0.038686s
 time_starttransfer:0.063550s
 time_total:0.063593s
 speed_download:37793.000
 http_code:200

time_namelookup:開始到DNS查詢完成的時間
time_connect:開始到TCP三次握手完成的時間
time_starttransfer:開始到收到服務端發來首位元組資料的時間
time_total:開始到服務端資料接收完成的時間

零基礎和大三大四的朋友看這裡>>c/c++ 企業級專案實戰

已經工作了想繼續自我提升跳槽漲薪的工程師看這裡>>c/c++ linux伺服器高階

檢查socket連線

由於網路通訊都需要靠socket,所以檢查一下socket連線以及它的分佈情況也是非常有必要的。
檢查埠是否監聽
服務端程式一定會監聽至少一個埠,檢查監聽socket是否存在,也是判斷服務程式是否還存在的一種方法。

netstat -nltp|grep 8080
lsof  -nP -i -sTCP:LISTEN|grep 8080

檢視socket狀態分佈

$ ss -s
$ netstat -nat | awk '/tcp/{print $6}'|sort|uniq -c
      9 CLOSE_WAIT
    102 ESTABLISHED
     55 LISTEN
     70 TIME_WAIT

需格外關注TIME_WAIT與CLOSE_WAIT這兩種狀態的數量,如果TIME_WAIT過多,可考慮優化核心網路引數或使用連線池,如果CLOSE_WAIT過多,就需要檢查程式程式碼中哪裡出現了連線洩露,導致未關閉連線了。
誰連我最多

netstat -ant | awk '/tcp/{rl=split($5,r,":");printf "%16s\t%s\n",$4,r[rl-1]}' | sort | uniq -c | sort -nrk1 | head -n10

我連誰最多

netstat -ant | awk '/tcp/{ll=split($4,l,":");printf "%11s\t%s\n",l[ll-1],$5}' | sort | uniq -c | sort -nrk1 | head -n10

網路使用率檢測

檢視各連線網速

iftop -B -nNP

檢視各程式網速

nethogs

檢視網路卡網速

sar -n DEV 1
ifstat 

檢視網路卡是否丟包

# ifconfig命令,觀察overrun/error/drop這幾項
ifconfig
# 同樣,觀察類似overflow、error、drop這些項
ethtool -S eth0

TCP層丟包與重傳
有時,網路卡層未出現丟包,但網路中間鏈路有可能出現丟包,這會導致tcp層重傳,另外,如果tcp層的核心引數設定不合理,也可能導致丟包,比如backlog設定過小,伺服器端網路io處理不過來。

$ sar -n TCP,ETCP 1
$ sudo watch -d -n1  'netstat -s|grep -iE "listen|pruned|collapsed|reset|retransmit"'
    2879 connection resets received
    378542 segments retransmitted
    3357875 resets sent
    52 resets received for embryonic SYN_RECV sockets
    5 times the listen queue of a socket overflowed
    5 SYNs to LISTEN sockets dropped
    TCPLostRetransmit: 235599
    6337 fast retransmits
    7877 retransmits in slow start
    10385 connections reset due to unexpected data
    1183 connections reset due to early user close

網路抓包

純文字抓包

# ngrep比較適合抓包類似http這種的純文字協議
sudo ngrep -W byline port 3306
# 在無法使用抓包命令的情況下,也可使用nc、socat之類的網路工具,做一個埠轉發,同時將轉發流量列印出來
# 另外在抓包https時,也可以使用socat將https流量代理為http流量,再進行抓包
socat -v TCP4-LISTEN:9999,bind=0.0.0.0,reuseaddr TCP4:remoteIp:9999

通用抓包工具

# tcpdump抓包給wireshark分析
sudo tcpdump tcp -i eth1 -s 0 -c 10000 and port 9999 -w ./target.cap
# 抓rst包,用於網路經常出現connection reset異常的情況
sudo tcpdump -ni any -s0 tcp and 'tcp[13] & 4 != 0 ' -vvv
# 抓fin包,用於網路經常斷連的情況
sudo tcpdump -ni any -s0 tcp and 'tcp[13] & 1 != 0 ' -vvv

mysql抓包

$ sudo tshark -i eth0 -n -f 'tcp port 3306' -Y 'mysql' -T fields  -e frame.number -e frame.time_epoch -e frame.time_delta_displayed  -e ip.src -e tcp.srcport -e tcp.dstport -e ip.dst -e tcp.stream -e tcp.len -e tcp.nxtseq -e tcp.time_delta -e tcp.analysis.ack_rtt -e mysql.query
Running as user "root" and group "root". This could be dangerous.
Capturing on 'ens33'
4       1605412440.114466205    0.000000000     10.224.72.135   3306    59016   10.221.38.217   0       88      89      0.001027726
6       1605412440.160709874    0.046243669     10.221.38.217   59016   3306    10.224.72.135   0       185     186     0.000020998
8       1605412440.160929986    0.000220112     10.224.72.135   3306    59016   10.221.38.217   0       48      137     0.000211802
9       1605412440.213810997    0.052881011     10.221.38.217   59016   3306    10.224.72.135   0       24      210     0.052881011     0.052881011
11      1605412440.214178087    0.000367090     10.224.72.135   3306    59016   10.221.38.217   0       22      159     0.000341184
12      1605412440.258391363    0.044213276     10.221.38.217   59016   3306    10.224.72.135   0       37      247     0.044213276     0.044213276     select @@version_comment limit 1
14      1605412440.258812895    0.000421532     10.224.72.135   3306    59016   10.221.38.217   0       83      242     0.000395748
15      1605412440.303693157    0.044880262     10.221.38.217   59016   3306    10.224.72.135   0       13      260     0.044880262     0.044880262     select 1
16      1605412440.303955060    0.000261903     10.224.72.135   3306    59016   10.221.38.217   0       49      291     0.000261903     0.000261903
17      1605412440.351387241    0.047432181     10.221.38.217   59016   3306    10.224.72.135   0       5       265     0.047432181     0.047432181

grpc抓包
對於grpc抓包,可以先使用tcpdump抓下來,然後到wireshark中檢視,也可使用我從github找到的這個專案github.com/rmedvedev/grpcdump

sudo grpcdump -i eth0 -p 9999 -proto-path ~/protos -proto-files order/v1/log_service.proto

傳輸檔案

使用scp

#上傳檔案到遠端機器
scp test.txt [email protected]:/home/
#從遠端機器下載檔案
scp [email protected]:/home/test.txt .

使用ncat
ncat其實就是常說的nc,但由於netcat也叫nc且用法稍有不同(ubuntu上的nc就是netcat),避免混淆,這裡直接使用ncat

# 接收檔案端
ncat -l 9999 > test.txt
# 傳送檔案端
ncat remoteIp 9999 < test.txt

使用python http server
python的http server經常用於分享本機檔案給其它人,非常方便。

python -m SimpleHTTPServer 8000
wget http://remoteIp:8000/test.txt

使用使用python ftp server
使用python可以快速搭建一個ftp server,這樣就即可以上傳,又可以下載了。

sudo pip3 install pyftpdlib
python3 -m pyftpdlib -p 2121 -w
#上傳到ftp
curl ftp://remoteIp:2121/files/ -T file.txt
#從ftp下載
curl -O ftp://remoteIp:2121/files/file.txt

總結

掌握常用的網路命令,還是非常有必要的,畢竟網路是如此複雜,必須要有東西能夠窺探一些內部執行資訊。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
beiyou