nc命令,網(wǎng)絡(luò)工具中的“瑞士軍刀”了解一下?
作者:守望,Linux應(yīng)用開發(fā)者,目前在公眾號【編程珠璣】分享Linux/C/C++/數(shù)據(jù)結(jié)構(gòu)與算法/工具等原創(chuàng)技術(shù)文章和學(xué)習(xí)資源。
前言
前面介紹過一個不可不知的網(wǎng)絡(luò)命令-netstat,今天來介紹這個網(wǎng)絡(luò)工具界的“瑞士軍刀”-nc(netcat),它短小精悍,是網(wǎng)絡(luò)調(diào)試利器,它到底有何能耐呢?
查看端口是否被占用
還記得我們在netstat中介紹的如何查看端口被占用嗎?nc也可以完成這樣的事情。它使用-l(listen)參數(shù),用于綁定指定端口并監(jiān)聽連接:
- $ nc -l 6379
- nc: Address already in use
當(dāng)看到Address already in use的時候,就知道這個端口被占用了,否則它就會在這個端口監(jiān)聽。當(dāng)然這個作用是我瞎說的,但是可以用。
端口掃描
例如需要掃描某個機器上21-30哪些端口是開放的:
- $ nc -n 127.0.0.1 -z 1230-1234 -v
- nc: connect to 127.0.0.1 port 1230 (tcp) failed: Connection refused
- nc: connect to 127.0.0.1 port 1231 (tcp) failed: Connection refused
- nc: connect to 127.0.0.1 port 1232 (tcp) failed: Connection refused
- nc: connect to 127.0.0.1 port 1233 (tcp) failed: Connection refused
- Connection to 127.0.0.1 1234 port [tcp/*] succeeded!
其中-n說明直接使用ip地址,而不使用域名,-z指定端口范圍,-v輸出詳細信息。從結(jié)果就可以看到,1234端口是可連接的。
TCP/UDP連接測試
當(dāng)你在學(xué)習(xí)TCP相關(guān)的內(nèi)容時,是否想著如何自己實踐觀察里面的狀態(tài)或者數(shù)據(jù)包?雖然推薦自己去寫一個TCP連接的服務(wù)端-客戶端程序,但是也可以利用nc命令來完成,例如,在一個終端中輸入如下內(nèi)容:
- $ nc -l 1234
- hello 編程珠璣
表明在1234端口監(jiān)聽,然后可以在另外一個終端進行連接;
- $ nc 127.0.0.1 1234
- hello 編程珠璣
連接本地地址1234端口,這個過程中就可以抓包,分析TCP的三次握手了。
除此之外,你還可以在建立好的連接之間發(fā)送消息(簡單的聊天功能),讓你分析更多!
默認情況,它創(chuàng)建的是TCP連接,而使用-u(UDP)參數(shù)可以測試UDP連通性。
- $ nc -v -u 182.3.226.35 80
- Connection to 182.3.226.35 80 port [udp/http] succeeded!
除此之外,還有很多參數(shù)用于調(diào)試,例如:
- -b 允許廣播消息
- -D 開啟socket調(diào)試模式
- -d 禁止從標準輸入讀取內(nèi)容
- -k 客戶端退出后,保持連接
- -v 顯示詳細信息
由于在后面的文章中還會借助nc來說明,因此這里不詳解介紹。
HTTP連接測試
例如查看HTTP頭信息:
- $ nc www.baidu.com 80
- HEAD / HTTP/1.1
- HTTP/1.1 302 Found
- Connection: Keep-Alive
- Content-Length: 17931
- Content-Type: text/html
- Date: Sun, 23 Jun 2019 13:52:12 GMT
- Etag: "54d9748e-460b"
- Server: bfe/1.0.8.18
連接后,輸入HEAD / HTTP/1.1或HEAD / HTTP/1.0,然后輸入兩個回車,可查看web服務(wù)器相關(guān)信息。
數(shù)據(jù)傳輸
還是利用前面的連接,借助重定向符可以進行文件傳輸,例如服務(wù)端監(jiān)聽,并把內(nèi)容輸出到out.txt:
- $ nc -l 1234 > out.txt
而客戶端連接:
- $ nc 127.0.0.1 1234 < in.txt
這樣客戶端in.txt的內(nèi)容,就會傳輸?shù)給ut.txt
關(guān)于重定向,可參考《如何linux shell中的2 > &1》
當(dāng)然了,對于文件傳輸,scp命令能更好地完成這件事。如果你沒有其他辦法了,可以試試nc。
網(wǎng)絡(luò)測試
前面說到可以通過nc傳輸數(shù)據(jù),同樣如果我們想測試兩個主機間的網(wǎng)絡(luò)速度(當(dāng)然你可以利用iperf工具來完成這個工作),nc也是可以幫忙的:
- #服務(wù)端監(jiān)聽:
- $ nc -vl 1234 >/dev/null
其中重定向到/dev/null,表示將數(shù)據(jù)丟棄。
然后在另一臺主機上執(zhí)行:
- $ dd if=/dev/zero bs=1M count=10 |nc -vn 127.0.0.1 1234
- Connection to 127.0.0.1 1234 port [tcp/*] succeeded!
- 10+0 records in
- 10+0 records out
- 10485760 bytes (10 MB, 10 MiB) copied, 0.0333675 s, 314 MB/s
dd拷貝數(shù)據(jù),這里從/dev/zero拷貝數(shù)據(jù)0,且一次1M,拷貝10次,最后通過nc命令發(fā)送到服務(wù)端。結(jié)束后,就可以看到統(tǒng)計信息了。
總結(jié)
nc命令短小精悍,但在很多方面能夠幫助我們,例如:
- 端口掃描
- 連接測試
- TCP/UDP服務(wù)端客戶端監(jiān)聽與連接
- 網(wǎng)絡(luò)測試
- 代理
nc命令的更多妙用等著你去探索!