文章目錄
-
- 1 NC 簡介
-
- 1.1 nc 的作用
- 1.2 nc 的常用參數
- 2 舉例
-
- 2.1 前期準備
- 2.2 nc 用法1,網絡連通性測試和端口掃描
-
- 2.2.1 TCP 測試方法
- 2.2.2 UDP 測試方法
- 2.3 nc 用法2,傳輸檔案和目錄
- 2.4 nc 用法3,測試網速
- 2.5 nc 用法4,互相發送消息
1 NC 簡介
nc 是 netcat 的簡寫,有着網絡界的瑞士軍刀美譽。因為它短小精悍、功能實用,被設計為一個簡單、可靠的網絡工具。
1.1 nc 的作用
- 實作任意 TCP/UDP 端口的偵聽,nc 可以作為 server 以 TCP 或 UDP 方式偵聽指定端口。
- 端口的掃描,nc 可以作為 client 發起 TCP 或 UDP 連接配接。
- 機器之間傳輸檔案。
- 機器之間網絡測速。
1.2 nc 的常用參數
-
用于指定 nc 将處于偵聽模式。指定該參數,則意味着 nc 被當作 server,偵聽并接受連接配接,而非向其它位址發起連接配接。-l
-
暫未用到(老版本的 nc 可能需要在端口号前加 -p 參數,下面測試環境是 centos6.6,nc 版本是 nc-1.84,未用到 -p 參數)。-p <port>
-
指定發送資料的源IP位址,适用于多網卡機 。-s
-
指定 nc 使用 UDP 協定,預設為 TCP。-u
-
輸出互動或出錯資訊,新手調試時尤為有用。-v
-
逾時秒數,後面跟數字。-w
-
表示 zero,表示掃描時不發送任何資料。-z
2 舉例
2.1 前期準備
準備兩台機器,用于測試 nc 指令的用法
- 主機A:ip位址 10.0.1.161
- 主機B:ip位址 10.0.1.162
兩台機器先安裝 nc 和 nmap:
yum install nc -y
yum install nmap -y
2.2 nc 用法1,網絡連通性測試和端口掃描
2.2.1 TCP 測試方法
nc 可以作為 server 端啟動一個 tcp 的監聽(注意,此處重點是起 tcp,下面還會講 udp)。
先關閉 A 的防火牆,或者放行下面端口,然後測試 B 機器是否可以通路 A 機器啟動的端口。
在 A 機器上啟動一個端口監聽,比如 9999 端口(注意:下面的 -l 是小寫的 L,不是數字1),預設情況下下面監聽的是一個 tcp 的端口。
nc -l 9999
用戶端測試,測試方法1
在 B 機器上 telnet A 機器此端口,如下顯示表示 B 機器可以通路 A 機器此端口:
用戶端測試,測試方法2
B 機器上也可以使用 nmap 掃描 A 機器的此端口:
nmap 10.0.1.161 -p9999
用戶端測試,測試方法3
使用 nc 指令作為用戶端工具進行端口探測:
nc -vz -w 2 10.0.1.161 9999
-v 可視化,-z 掃描時不發送資料,-w 逾時幾秒,後面跟數字。
上面指令也可以寫成:
nc -vzw 2 10.0.1.161 9999
用戶端測試,測試方法4(和方法3相似,但用處更大)
nc 可以可以掃描連續端口,這個作用非常重要。常常可以用來掃描伺服器端口,然後給伺服器安全加強。
在 A 機器上監聽2個端口,一個9999,一個9998,使用 & 符号背景模式運作。
在用戶端 B 機器上掃描連續的兩個端口,如下:
2.2.2 UDP 測試方法
nc 作為 server 端啟動一個 udp 的監聽(注意,此處重點是起 udp,上面主要講了 tcp)。
啟動一個 udp 的端口監聽:
nc -ul 9998
複制目前視窗輸入
netstat -antup |grep 9998
可以看到是啟動了 udp 的監聽:
用戶端測試,測試方法1
nc -vuz 10.0.1.161 9998
由于 udp 的端口無法在用戶端使用 telnet 去測試,我們可以使用 nc 指令去掃描(telnet 是運作于 tcp 協定的)。
u 表示 udp 端口,v 表示可視化輸出,z 表示掃描時不發送資料。
上面在 B 機器掃描此端口的時候,看到 A 機器下面出現一串 XXXXX 字元串:
用戶端測試,測試方法2
nmap -sU 10.0.1.161 -p 9998 -Pn
上述指令暫無法測試 nc 啟動的 udp 端口,每次探測 nc 作為 server 端啟動的 udp 端口時,會導緻對方退出偵聽,有這個 bug,對于一些程式啟動的 udp 端口在使用 nc 掃描時不會有此 bug。
下面,A 機器啟動一個 udp 的端口監聽,端口為 9998.
在複制的視窗上可以确認已經在監聽了:
B 機器使用 nmap 指令去掃描此 udp 端口,在掃描過程中,導緻 A 機器的 nc 退出監聽。是以顯示端口關閉了(我推測是掃描時發資料導緻的)。
nmap -sU 10.0.1.161 -p 9998 -Pn
-sU :表示 udp 端口的掃描。
-Pn :如果伺服器禁 PING 或者放在防火牆下面的,不加 -Pn 參數的它就會認為這個掃描的主機不存活就不會進行掃描了,如果不加 -Pn 就會像下面的結果一樣,它也會進行提示你添加上 -Pn 參數嘗試的。
注意: 如果A機器開啟了防火牆,掃描結果可能會是下面狀态。(不能确定對方是否有監聽9998端口)
既然上面測試無法使用 nmap 掃描 nc 作為服務端啟動的端口,我們可以使用nmap掃描其餘的端口。
額,有點跑題了,講 nmap 的用法了,沒關系,主要為了說明 nmap 是也可以用來掃描 udp 端口的,隻是掃描 nc 啟動的端口會導緻對方退出端口監聽。
下面,A 機器上 rpcbind 服務,監聽在 udp 的 111 端口:
在 B 機器上使用 nmap 掃描此端口,是正常的檢測到處于 open 狀态:
用戶端測試,測試方法3
nc 掃描大量 udp 端口。
掃描過程比較慢,可能是1秒掃描一個端口,下面表示掃描A機器的1到1000端口(暫未發現可以在一行指令中掃描分散的幾個端口的方法)。
nc -vuz 10.0.1.161 1-1000
2.3 nc 用法2,傳輸檔案和目錄
方法1,傳輸檔案示範(先啟動接收指令)
使用 nc 傳輸檔案還是比較友善的,因為不用 scp 和 rsync 那種輸入密碼的操作了。
把 A 機器上的一個 rpm 檔案發送到 B 機器上,需注意操作次序,receiver 先偵聽端口,sender 向 receiver 所在機器的該端口發送資料。
步驟1,先在 B 機器上啟動一個接收檔案的監聽,格式如下:
nc -l port >file
此例中指令如下:
nc -l 9995 >zabbix.rpm
意思是把 9995 端口接收到的資料都寫到 file 檔案裡。
步驟2,在 A 機器上往 B 機器的 9995 端口發送資料,把下面 rpm 包發送過去:
nc 10.0.1.162 9995 < zabbix-release-2.4-1.el6.noarch.rpm
B 機器接收完畢,它會自動退出監聽,檔案大小和 A 機器一樣,md5 值也一樣:
方法2,傳輸檔案示範(先啟動發送指令)
步驟1,先在 B 機器上,啟動發送檔案指令
下面的指令表示通過本地的 9992 端口發送 test.mv 檔案:
nc -l 9992 <test.mv
步驟2,A 機器上連接配接 B 機器,取接收檔案
下面指令表示通過連接配接 B 機器的 9992 端口接收檔案,并把檔案存到本目錄下,檔案名為 test2.mv:
nc 10.0.1.162 9992 >test2.mv
方法3,傳輸目錄示範(方法發送檔案類似)
步驟1,B 機器先啟動監聽,如下
A 機器給 B 機器發送多個檔案,傳輸目錄需要結合其它的指令,比如 tar.
經過我的測試管道後面最後必須是 - ,不能是其餘自定義的檔案名。
nc -l 9995 | tar xfvz -
步驟2,A 機器打封包件并連接配接 B 機器的端口
管道前面表示把目前目錄的所有檔案打包為 - ,然後使用 nc 發送給 B 機器:
tar cfz - * | nc 10.0.1.162 9995
B 機器這邊已經自動接收和解壓:
2.4 nc 用法3,測試網速
測試網速其實利用了傳輸檔案的原理,就是把來自一台機器的 /dev/zero 發送給另一台機器的 /dev/null,就是把一台機器的無限個0,傳輸給另一個機器的空裝置上,然後新開一個視窗使用 dstat 指令監測網速。
在這之前需要保證機器先安裝 dstat 工具:
yum install -y dstat
方法1,測試網速示範(先啟動接收指令方式)
步驟1,A 機器先啟動接收資料的指令,監聽自己的 9991 端口,把來自這個端口的資料都輸出給空裝置(這樣不寫磁盤,測試網速更準确)。
nc -l 9991 >/dev/null
步驟2,B 機器發送資料,把無限個0發送給 A 機器的 9991 端口。
nc 10.0.1.161 9991 </dev/zero
在複制的視窗上使用 dstat 指令檢視目前網速,dstat 指令比較直覺,它可以檢視目前 cpu,磁盤,網絡,記憶體頁和系統的一些目前狀态名額。
我們隻需要看下面我選中的這2列即可,recv 是 receive 的縮寫,表示接收的意思,send 是發送資料,另外注意數字後面的機關 B,KB,MB.
可以看到 A 機器接收資料,平均每秒 400MB 左右:
B 機器新打開的視窗上執行 dstat,看到每秒發送 400MB 左右的資料:
方法2,測試網速示範(先啟動發送指令方式)
步驟1,先啟動發送的資料,誰連接配接這個端口時就會接收來自 zero 裝置的資料(二進制的無限個0)。
nc -l 9990 </dev/zero
步驟2,下面 B 機器連接配接 A 機器的 9990 端口,把接收的資料輸出到空裝置上。
nc 10.0.1.161 9990 >/dev/null
同樣可以使用 dstat 觀察資料發送時的網速:
2.5 nc 用法4,互相發送消息
步驟1,伺服器在某個端口上偵聽
nc -l 主機ip位址 端口号
當然也可以加上 -v 來顯示這個過程,如果不指定 ip 位址的話就預設是 0.0.0.0,相當于 INADDR_ANY。
步驟2,用戶端連接配接伺服器
nc 主機ip位址 端口号
連接配接成功後,可以在任何一終端來互相發送資料了。