為什么 Netcat 是最好的 Linux 故障排除工具之一
故障排除工具可以簡單,也可以非常復(fù)雜。它們可以非常小巧,也可以非常龐大,各種大小都有。是否需要將所有功能集中在一個(gè)工具中存在爭議。當(dāng)您使用適度的工具和實(shí)用程序解決問題時(shí),您將對問題有更深入的理解。
通過避免在不必要的中間件層后面混淆基本系統(tǒng),更容易理解系統(tǒng)。這是因?yàn)槟仨毣〞r(shí)間逐個(gè)測試和理解每個(gè)組件。
在本文中,我們將介紹一個(gè)非常簡單的故障排除工具,稱為 Netcat。這個(gè)實(shí)用程序已經(jīng)存在了近三十年,雖然表面上很簡陋,但在正確使用時(shí)提供了強(qiáng)大的功能和靈活性。
讓我們探索一下 Netcat 的一些多樣性。
它可以作為客戶端
如果您想測試遠(yuǎn)程服務(wù)器上的一個(gè)開放端口,那么沒有比使用 Netcat 更簡單的方法了。您可以通過 TCP 或 UDP 向服務(wù)器發(fā)送任意有效負(fù)載,發(fā)送到任何您想要的端口。
下面是一個(gè)簡單的示例,我們向運(yùn)行在本地主機(jī)上端口 5000 的服務(wù)器發(fā)送一些基本的 UDP 字符串?dāng)?shù)據(jù):
linuxmi@linuxmi ~/www.linuxmi.com
% echo "hello" | nc -u 127.0.0.1 5000
如果服務(wù)器期望接收此類型的數(shù)據(jù),它將會(huì)做出相應(yīng)的響應(yīng),并且您將在控制臺(tái)上看到響應(yīng)結(jié)果的打印輸出。如果服務(wù)器期望接收J(rèn)SON數(shù)據(jù)塊或其他二進(jìn)制數(shù)據(jù),您也可以以相同的方式將其傳輸?shù)絅etcat中。
以下是使用JSON數(shù)據(jù)的示例:
echo '{"key":"value"}' | nc -u 127.0.0.1 5000
假設(shè)遠(yuǎn)程服務(wù)器有一個(gè)集成的JSON解析器,您應(yīng)該能夠使用這種簡單的方法發(fā)送純JSON數(shù)據(jù)。只需記住在必要時(shí)跟蹤引號(hào)并對其進(jìn)行轉(zhuǎn)義。
它還可以作為服務(wù)器
Netcat也可以作為一個(gè)簡單的套接字服務(wù)器。假設(shè)您想要快速啟動(dòng)一個(gè)服務(wù)器,監(jiān)聽特定端口的傳入數(shù)據(jù)。使用Netcat非常簡單:
nc -l -u -p 5000 127.0.0.1
這個(gè)命令將在本地機(jī)器上打開5000端口,并監(jiān)聽傳入的UDP流量。如果將此與前面的客戶端命令結(jié)合起來,您可以將流量發(fā)送到服務(wù)器以進(jìn)行顯示。這意味著您可以創(chuàng)建一個(gè)簡單的消息中繼服務(wù)器,并且甚至可以使用Netcat在服務(wù)器之間傳輸數(shù)據(jù)。
這兩個(gè)命令也可以在TCP模式下運(yùn)行。只需刪除 -u 標(biāo)志,默認(rèn)情況下Netcat將以TCP模式運(yùn)行。
它可以發(fā)送不同類型的有效載荷
Netcat不僅功能豐富,可以同時(shí)作為客戶端和服務(wù)器,還可以發(fā)送各種負(fù)載。由于可以將數(shù)據(jù)通過管道傳輸?shù)絅etcat,您可以發(fā)送許多有趣的內(nèi)容。如果我們想使用Netcat發(fā)出一個(gè)HTTP GET請求會(huì)怎樣呢?
linuxmi@linuxmi ~/www.linuxmi.com
% printf 'GET / HTTP/1.1\r\nHost:google.com\r\n\r\n' | nc google.com 80
因?yàn)槲覀兪謩?dòng)鍵入了HTTP請求的格式,所以看起來有點(diǎn)凌亂,但它確實(shí)有效。這個(gè)命令會(huì)返回一個(gè)301,因?yàn)镚oogle只支持通過HTTPS工作。盡管它監(jiān)聽的是端口80,但它會(huì)將您重定向到443端口進(jìn)行安全連接。
將這樣的負(fù)載填充到Netcat對于像Google這樣的大型網(wǎng)站來說并沒有太大幫助,但對于小型開發(fā)服務(wù)器來說是有用的。如果您想手動(dòng)修改HTTP負(fù)載或發(fā)送錯(cuò)誤數(shù)據(jù),這是一個(gè)快速的方法。
當(dāng)然,還有其他更適合此任務(wù)的工具,比如curl,但是通過Netcat,您可以構(gòu)建原始請求。原始請求操作對于需要對發(fā)送的數(shù)據(jù)具有更精細(xì)控制的低級(jí)故障排除非常有用。
它可以查找開放的端口
這種多功能性不僅限于客戶端和服務(wù)器應(yīng)用程序。使用Netcat,您可以掃描基礎(chǔ)架構(gòu)以查找開放的端口。通過以下命令,您可以檢查服務(wù)器上的TCP端口是否開放:
linuxmi@linuxmi ~/www.linuxmi.com
% nc -zv google.com 80
這顯然會(huì)返回成功,因?yàn)镚oogle確實(shí)開放了用于傳入HTTP請求重定向的端口80。您可以更改為您喜歡的任何主機(jī)和端口。您甚至可以通過輸入一個(gè)端口范圍來掃描端口,例如:80-443。
如果您想掃描UDP端口,只需在命令中添加 -u 標(biāo)志。
如果您需要具有廣泛可配置選項(xiàng)的復(fù)雜網(wǎng)絡(luò)掃描,那么nmap可能是一個(gè)更好的選擇。如果您只需要快速檢查一些端口是否開放,為什么要安裝所有額外的復(fù)雜功能呢?
它可以傳輸文件
不,這不會(huì)是通過網(wǎng)絡(luò)發(fā)送文件的最快或最可靠的方式,但在緊急情況下它可以完成任務(wù)。如果您想通過Netcat發(fā)送文件,絕對可以做到。以下是如何設(shè)置遠(yuǎn)程服務(wù)器:
linuxmi@linuxmi ~/www.linuxmi.com
% nc -l -p 5000 > foo.txt
這將打開Netcat并在端口5000上進(jìn)行監(jiān)聽。傳入的數(shù)據(jù)將被寫入文件foo.txt。
而在實(shí)際發(fā)送文件的本地客戶端上,您可以執(zhí)行以下操作:
nc <host> 5000 < foo.txt
這將將foo.txt的內(nèi)容發(fā)送到 <host>,其中遠(yuǎn)程N(yùn)etcat服務(wù)器在端口5000上進(jìn)行監(jiān)聽。
這是一種快速而簡單的方法來傳輸少量數(shù)據(jù)。盡管它可以工作,但我強(qiáng)烈建議不要將Netcat作為主要的文件傳輸方式?,F(xiàn)在有更安全、更可靠的選項(xiàng)可供選擇。