本文首發于我的公衆号 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++程式設計技術等内容,歡迎大家關注。
stay hungry
stay foolish
----jobs
希望多多燒香!