- nc其实就是netcat工具,netcat工具在另一篇文章也有介绍:
一、nc简介
- nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具
二、nc的作用
实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
可以做端口的扫描,nc可以作为client发起TCP或UDP连接
机器之间传输文件
测试机器之间的网速
三、常用的参数
-l:用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接
-p <port>:版本的nc需要在端口号前加-p参数,下面测试环境是kali 2019,需要用到,如果是比较新的nc版本,则不需要该参数
-s :指定发送数据的源IP地址,适用于多网卡机
-u: 指定nc使用UDP协议,默认为TCP
-v:输出交互或出错信息,新手调试时尤为有用
-w:超时秒数,后面跟数字
-z:表示zero,表示扫描时不发送任何数据
四、nc作为tcp server监听
nc开启TCP端监听
- 开启一个tcp server监听端,端口为8000
测试1
- 在另一端使用telnet连接到该端口
- 连接之后,server端接收到连接
此时双方可以进行通信和发送数据了
- 客户端给server发送一个字符串“HelloWorld”
- server端给客户端发送一个字符串“I am server”
- 如果想要终止连接,就在服务端按下ctrl+c(终止)或者关闭客户端
- 如果两端只要有一段退出,此次nc会话就结束,服务端和客户端都关闭
测试2
- 使用nmap扫描该server
测试3
- 使用nc命令作为客户端工具进行端口探测
- 这种方法是进行一次连接,扫描之后,本次会话会终止
附加:nc扫描多个端口
- 第一步:开启两个端口监听
- 第二步:在另一端扫描两个端口
- 第三步:同时在另一侧看到这两个server都终止(会话结束)
五、nc作为udp server监听
nc开启UDP监听
- 使用netstat查看端口信息
- 由于udp的端口无法在客户端使用telnet去测试(telnet是运行于tcp协议的),下面我们也无法使用telnet去测试
测试1
- 使用nc命令去扫描(u表示udp端口,v表示可视化输出,z表示扫描时不发送数据)
- 同样,UDP server端终止,会话结束
测试2
- 使用nmap扫描
- -sU:表示udp端口的扫描
- -Pn:如果服务器禁PING或者放在防火墙下面的,不加-Pn 参数的它就会认为这个扫描的主机不存活就不会进行扫描了,如果不加-Pn就会像下面的结果一样,它也会进行提示你添加上-Pn参数尝试的
- 192.168.43.62开启了防火墙,扫描结果可能会显示filtered(不能确定对方是否有监听8000端口)
测试3
- nc扫描大量udp端口
- 扫描过程比较慢,可能是1秒扫描一个端口
六、nc传输文件
nc传输文件的特点:
- 使用nc传输文件还是比较方便的,因为不用scp和rsync那种输入密码的操作了
- 把A机器上的一个rpm文件发送到B机器上
- 需注意操作次序,receiver先侦听端口,sender向receiver所在机器的该端口发送数据。
先监听再发送
- 先在右侧8000端口监听,将接收到的数据都存入文件里(下面我们存入test.rpm)
- 其实这就是开启一个服务端,然后将接收到的数据重定向test.rpm文件中
- 备注:这个test.rpm文件已经建立了,但是还没有数据
- 再在左侧往右侧的8000端口发送数据,把下面rpm包发送过去
- 其实这就是开启一个客户端,将信息输出到server端
- 终止右侧的服务端
- 查看两个文件的内容一模一样
先发送再监听
这个其实与上面的步骤是相反的,但是原理是相同的
- 右侧将hello.txt的文件内容作为8000端口的数据发送出去(其实就是开启一个服务端)
- 左侧接受右侧的8000端口的数据,存放到test.rpm文件中(其实就是开启一个客户端)
- server端终止
- 查看文件内容
七、nc传输多个文件和目录
我们首先建立(a、b、c、d、e、f)6个文件
右侧先启动监听
- 左侧给右侧发送多个文件,传输目录需要结合其它的命令,比如tar,经过我的测试管道后面最后必须是 - ,不能是其余自定义的文件名
- (因为在同一台机器下实验,所以为了防止文件冲突,我们接收端更换了路径)
左侧打包文件并连接右侧的端口
- 管道前面表示把当前目录的所有文件打包为 - ,然后使用nc发送给右侧
- 右侧已经自动接收和解压
- 终止右侧server端,查看接收到的文件
八、nc测试网速
- 原理:测试网速其实利用了传输文件的原理,就是把来自一台机器的/dev/zero 发送给另一台机器的/dev/null就是把一台机器的无限个0,传输给另一个机器的空设备上,然后新开一个窗口使用dstat命令监测网速
- 此处我们的测试环境为CentOS,使用dstat工具,其他Linux系统可能没有这个工具