Linux網絡命令必知必會之瑞士軍刀 nc(netcat)


本文首發於我的公眾號 Linux雲計算網絡(id: cloud_dev),專注於干貨分享,號內有 10T 書籍和視頻資源,后台回復「1024」即可領取,歡迎大家關注,二維碼文末可以掃。

nc,全名叫 netcat,它可以用來完成很多的網絡功能,譬如端口掃描、建立TCP/UDP連接,數據傳輸、網絡調試等等,因此,它也常被稱為網絡工具的 瑞士軍刀

使用方式

我們可以這樣來使用它:

nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port] [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [hostname] [port[s]]

常用選項:

  • -4:只使用 IPv4 地址
  • -6:只使用 IPv6 地址
  • -l:啟動本地監聽
  • -n:不使用 DNS 解析
  • -p:指定源端口
  • -s:指定源 IP 地址
  • -u:使用 UDP,默認是 TCP
  • -v:顯示詳細信息
  • -w:設定超時時間(只適合用在 Client 端)
  • -d:禁止從標准輸入讀取數據,也就是客戶端輸入數據不會發送到服務端
  • -k:讓服務端保持連接,不斷開

Linux 系統默認沒有安裝 nc,可以用下面的方法安裝:

# centos
yum install nc
# ubuntu
apt-get install netcat

建立 C/S 聊天室

nc 的本質是在兩台機器之間建立連接,之后就可以基於這個連接做很多事情,數據傳輸是其中一個最為基本的。我們下面就使用 nc 來建立一個 C/S 的聊天室。

模擬 Server 端:

# -v :輸出詳細信息
# -l :指定監聽地址和端口
nc -v -l 127.0.0.1 6000

模擬 Client 端:

# -p : 指定源端口
nc -v -p 5000 localhost 6000

之后,Client 和 Server 端就可以相互聊天了。

Client:

# nc -v -p 5000 localhost 6000
nc: connect to localhost port 6000 (tcp) failed: Connection refused
Connection to localhost 6000 port [tcp/x11] succeeded!
Hi, server
Hi, client

Server:

# nc -v -l 127.0.0.1 6000
Listening on [127.0.0.1] (family 0, port 6000)
Connection from [127.0.0.1] port 6000 [tcp/x11] accepted (family 2, sport 5000)
Hi, server
Hi, client

發送文件

nc 不僅可以發送消息,還可發送文件。

假設服務端有一個 out.txt 的空文件,而客戶端有一個 in.txt 文件,含有數據:hello server

Server 端接收文件:

nc localhost 6000 > out.txt

Client 端發送文件:

nc localhost 6000 < in.txt

之后,我們可以看到 Server 端的 out.txt 文件中已經有數據了:

# cat out.txt
hello server

除了可以發送文件,nc 也可以發送目錄,只需要將目錄壓縮發送即可。

支持 UDP 和 IPv6 連接

nc 默認使用 TCP 和 IPv4 協議建立連接,我們可以使用參數 -u-6 參數來分別使用建立 UDP 和 IPv6 連接。

Server 端:

nc -u -6 -l localhost 6000

Client 端:

nc -u -6 localhost 6000

再開另一個終端,用 lsof 驗證:

# lsof -Pni | grep nc
nc       1966            root    3u  IPv6  19317      0t0  UDP *:6000
nc       1976            root    3u  IPv6  19330      0t0  UDP [::1]:49900->[::1]:6000

可以看到,Client 端和 Server 端都顯示使用了 UDP 和 IPv6 協議。

端口掃描

端口掃描是一個非常重要的功能,很多時候系統管理員會通過掃描服務器上端口,來識別系統中漏洞,nc 工具提供了非常方便的操作:

nc -vz 192.168.0.117 1-100

這條命令掃描 192.168.1.3 上 1-100 端口區間,有哪些端口是開放的。

# nc -vz 192.168.0.117 1-100
...
nc: connect to 192.168.0.117 port 21 (tcp) failed: Connection refused
Connection to 192.168.0.117 22 port [tcp/ssh] succeeded!
nc: connect to 192.168.0.117 port 23 (tcp) failed: Connection refused
...

可以看到,只有 22 號端口是開放的。

如果我們想掃描多個服務器上的多個端口是否開放,可以寫一個腳本來完成,比如:

首先,用一個 sip.txt 保存所有服務器的地址:

# cat sip.txt
192.168.1.2
192.168.1.3
192.168.1.4

再用一個 port.txt保存要掃描的端口號:

# cat port.txt
22 
80

然后,寫一個腳本 portscan.sh 來遍歷這個文件。

# vim portscan.sh
#!/bin/sh
for server in `more sip.txt`
do
for port in `more port.txt`
do
nc -zv $server $port
echo ""
done
done

給這個腳本賦予可執行權限:

chmod +x portscan.sh

運行這個腳本就可以自動掃描多個服務器的多個端口是否開放了。

# sh portscan.sh
Connection to 192.168.1.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.2 80 port [tcp/http] succeeded!

Connection to 192.168.1.3 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.3 80 port [tcp/http] succeeded!

Connection to 192.168.1.4 22 port [tcp/ssh] succeeded!
Connection to 192.168.1.4 80 port [tcp/http] succeeded!

總結

nc 通過在兩台機器之間建立連接來完成很多網絡功能,數據傳輸、網絡連接、端口掃描等,也有助於我們進行網絡調試,排查網絡故障。


后台回復“加群”,帶你進入高手如雲交流群

我的公眾號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,后台回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM