天天看點

nc 指令用法舉例

文章目錄

    • 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 的作用

  1. 實作任意 TCP/UDP 端口的偵聽,nc 可以作為 server 以 TCP 或 UDP 方式偵聽指定端口。
  2. 端口的掃描,nc 可以作為 client 發起 TCP 或 UDP 連接配接。
  3. 機器之間傳輸檔案。
  4. 機器之間網絡測速。

1.2 nc 的常用參數

  1. -l

    用于指定 nc 将處于偵聽模式。指定該參數,則意味着 nc 被當作 server,偵聽并接受連接配接,而非向其它位址發起連接配接。
  2. -p <port>

    暫未用到(老版本的 nc 可能需要在端口号前加 -p 參數,下面測試環境是 centos6.6,nc 版本是 nc-1.84,未用到 -p 參數)。
  3. -s

    指定發送資料的源IP位址,适用于多網卡機 。
  4. -u

    指定 nc 使用 UDP 協定,預設為 TCP。
  5. -v

    輸出互動或出錯資訊,新手調試時尤為有用。
  6. -w

    逾時秒數,後面跟數字。
  7. -z

    表示 zero,表示掃描時不發送任何資料。

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
           
nc 指令用法舉例

用戶端測試,測試方法1

在 B 機器上 telnet A 機器此端口,如下顯示表示 B 機器可以通路 A 機器此端口:

nc 指令用法舉例

用戶端測試,測試方法2

B 機器上也可以使用 nmap 掃描 A 機器的此端口:

nmap 10.0.1.161 -p9999
           
nc 指令用法舉例

用戶端測試,測試方法3

使用 nc 指令作為用戶端工具進行端口探測:

nc -vz -w 2 10.0.1.161 9999
           

-v 可視化,-z 掃描時不發送資料,-w 逾時幾秒,後面跟數字。

nc 指令用法舉例

上面指令也可以寫成:

nc -vzw 2 10.0.1.161 9999
           
nc 指令用法舉例

用戶端測試,測試方法4(和方法3相似,但用處更大)

nc 可以可以掃描連續端口,這個作用非常重要。常常可以用來掃描伺服器端口,然後給伺服器安全加強。

在 A 機器上監聽2個端口,一個9999,一個9998,使用 & 符号背景模式運作。

nc 指令用法舉例

在用戶端 B 機器上掃描連續的兩個端口,如下:

nc 指令用法舉例

2.2.2 UDP 測試方法

nc 作為 server 端啟動一個 udp 的監聽(注意,此處重點是起 udp,上面主要講了 tcp)。

啟動一個 udp 的端口監聽:

nc  -ul  9998
           
nc 指令用法舉例

複制目前視窗輸入

netstat -antup |grep 9998

可以看到是啟動了 udp 的監聽:

nc 指令用法舉例

用戶端測試,測試方法1

nc -vuz 10.0.1.161 9998
           

由于 udp 的端口無法在用戶端使用 telnet 去測試,我們可以使用 nc 指令去掃描(telnet 是運作于 tcp 協定的)。

u 表示 udp 端口,v 表示可視化輸出,z 表示掃描時不發送資料。

nc 指令用法舉例

上面在 B 機器掃描此端口的時候,看到 A 機器下面出現一串 XXXXX 字元串:

nc 指令用法舉例

用戶端測試,測試方法2

nmap -sU 10.0.1.161 -p 9998 -Pn
           

上述指令暫無法測試 nc 啟動的 udp 端口,每次探測 nc 作為 server 端啟動的 udp 端口時,會導緻對方退出偵聽,有這個 bug,對于一些程式啟動的 udp 端口在使用 nc 掃描時不會有此 bug。

下面,A 機器啟動一個 udp 的端口監聽,端口為 9998.

在複制的視窗上可以确認已經在監聽了:

nc 指令用法舉例

B 機器使用 nmap 指令去掃描此 udp 端口,在掃描過程中,導緻 A 機器的 nc 退出監聽。是以顯示端口關閉了(我推測是掃描時發資料導緻的)。

nmap -sU 10.0.1.161 -p 9998 -Pn
           

-sU :表示 udp 端口的掃描。

-Pn :如果伺服器禁 PING 或者放在防火牆下面的,不加 -Pn 參數的它就會認為這個掃描的主機不存活就不會進行掃描了,如果不加 -Pn 就會像下面的結果一樣,它也會進行提示你添加上 -Pn 參數嘗試的。

nc 指令用法舉例

注意: 如果A機器開啟了防火牆,掃描結果可能會是下面狀态。(不能确定對方是否有監聽9998端口)

nc 指令用法舉例

既然上面測試無法使用 nmap 掃描 nc 作為服務端啟動的端口,我們可以使用nmap掃描其餘的端口。

額,有點跑題了,講 nmap 的用法了,沒關系,主要為了說明 nmap 是也可以用來掃描 udp 端口的,隻是掃描 nc 啟動的端口會導緻對方退出端口監聽。

下面,A 機器上 rpcbind 服務,監聽在 udp 的 111 端口:

nc 指令用法舉例

在 B 機器上使用 nmap 掃描此端口,是正常的檢測到處于 open 狀态:

nc 指令用法舉例

用戶端測試,測試方法3

nc 掃描大量 udp 端口。

掃描過程比較慢,可能是1秒掃描一個端口,下面表示掃描A機器的1到1000端口(暫未發現可以在一行指令中掃描分散的幾個端口的方法)。

nc -vuz 10.0.1.161 1-1000
           
nc 指令用法舉例

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 檔案裡。

nc 指令用法舉例

步驟2,在 A 機器上往 B 機器的 9995 端口發送資料,把下面 rpm 包發送過去:

nc 10.0.1.162 9995 < zabbix-release-2.4-1.el6.noarch.rpm
           
nc 指令用法舉例

B 機器接收完畢,它會自動退出監聽,檔案大小和 A 機器一樣,md5 值也一樣:

nc 指令用法舉例

方法2,傳輸檔案示範(先啟動發送指令)

步驟1,先在 B 機器上,啟動發送檔案指令

下面的指令表示通過本地的 9992 端口發送 test.mv 檔案:

nc -l 9992 <test.mv
           
nc 指令用法舉例

步驟2,A 機器上連接配接 B 機器,取接收檔案

下面指令表示通過連接配接 B 機器的 9992 端口接收檔案,并把檔案存到本目錄下,檔案名為 test2.mv:

nc 10.0.1.162 9992 >test2.mv
           
nc 指令用法舉例

方法3,傳輸目錄示範(方法發送檔案類似)

步驟1,B 機器先啟動監聽,如下

A 機器給 B 機器發送多個檔案,傳輸目錄需要結合其它的指令,比如 tar.

經過我的測試管道後面最後必須是 - ,不能是其餘自定義的檔案名。

nc -l 9995 | tar xfvz -
           
nc 指令用法舉例

步驟2,A 機器打封包件并連接配接 B 機器的端口

管道前面表示把目前目錄的所有檔案打包為 - ,然後使用 nc 發送給 B 機器:

tar cfz - * | nc 10.0.1.162 9995
           
nc 指令用法舉例

B 機器這邊已經自動接收和解壓:

nc 指令用法舉例

2.4 nc 用法3,測試網速

測試網速其實利用了傳輸檔案的原理,就是把來自一台機器的 /dev/zero 發送給另一台機器的 /dev/null,就是把一台機器的無限個0,傳輸給另一個機器的空裝置上,然後新開一個視窗使用 dstat 指令監測網速。

在這之前需要保證機器先安裝 dstat 工具:

yum install -y dstat
           

方法1,測試網速示範(先啟動接收指令方式)

步驟1,A 機器先啟動接收資料的指令,監聽自己的 9991 端口,把來自這個端口的資料都輸出給空裝置(這樣不寫磁盤,測試網速更準确)。

nc -l 9991 >/dev/null
           
nc 指令用法舉例

步驟2,B 機器發送資料,把無限個0發送給 A 機器的 9991 端口。

nc 10.0.1.161 9991 </dev/zero
           
nc 指令用法舉例

在複制的視窗上使用 dstat 指令檢視目前網速,dstat 指令比較直覺,它可以檢視目前 cpu,磁盤,網絡,記憶體頁和系統的一些目前狀态名額。

我們隻需要看下面我選中的這2列即可,recv 是 receive 的縮寫,表示接收的意思,send 是發送資料,另外注意數字後面的機關 B,KB,MB.

nc 指令用法舉例

可以看到 A 機器接收資料,平均每秒 400MB 左右:

nc 指令用法舉例

B 機器新打開的視窗上執行 dstat,看到每秒發送 400MB 左右的資料:

nc 指令用法舉例

方法2,測試網速示範(先啟動發送指令方式)

步驟1,先啟動發送的資料,誰連接配接這個端口時就會接收來自 zero 裝置的資料(二進制的無限個0)。

nc -l 9990 </dev/zero
           
nc 指令用法舉例

步驟2,下面 B 機器連接配接 A 機器的 9990 端口,把接收的資料輸出到空裝置上。

nc 10.0.1.161 9990 >/dev/null
           
nc 指令用法舉例

同樣可以使用 dstat 觀察資料發送時的網速:

nc 指令用法舉例

2.5 nc 用法4,互相發送消息

步驟1,伺服器在某個端口上偵聽

nc -l 主機ip位址 端口号
           

當然也可以加上 -v 來顯示這個過程,如果不指定 ip 位址的話就預設是 0.0.0.0,相當于 INADDR_ANY。

步驟2,用戶端連接配接伺服器

nc 主機ip位址 端口号
           

連接配接成功後,可以在任何一終端來互相發送資料了。