查看原文
其他

nc - 网络工具箱中的「瑞士军刀」

一口Linux 2021-11-06

The following article is from Linux开发那些事儿 Author LinuxThings

nc 是 Linux下强大的网络命令行工具,主要用于 TCP、UDP、UNIX域套接字 相关的操作
它被设计成可以由其他程序灵活驱动可靠的后台工具,拥有 "瑞士军刀" 的美称,每个系统管理员都应该掌握它


安装

下是 nc工具的安装,完成后执行 nc --version 命令, 如果返回nc的版本信息表示安装成功

yum install nc[root@ecs-centos-7 ~]# nc --versionNcat: Version 7.50 ( https://nmap.org/ncat )


扫描端口

有时需要测试服务器的端口连通性,下面是测试服务器(IP:10.3.3.3 22) 22 端口是否开启的例子
[root@ecs-centos-7 ~]# nc -z -v -w 3 10.3.3.3 22Ncat: Version 7.50 ( https://nmap.org/ncat )Ncat: Connected to 10.3.3.3 22:22.Ncat: 0 bytes sent, 0 bytes received in 0.03 seconds.[root@ecs-centos-7 ~]# nc -z -v -w 3 10.3.3.3 22 6000Ncat: Version 7.50 ( https://nmap.org/ncat )Ncat: Connection refused.


-z 选项是报告连接状态(只连接不发送数据)


-v 选项是输出命令结果信息


-w 是设置超时时间,默认是秒,如果要设置毫秒的话,可以在数字后面加上 ms, 比如:上面的 -w 3 是3秒超时,-w 300ms 表示超时时间是300毫秒


从上面的结果可以看出,目标服务器上 22 端口是开启的,6000 端口是关闭的


例子中扫描的是 TCP 协议的端口,如果要扫描 UDP 协议的端口,需要加上 -u 选项,如果换成 UDP端口的话,上面的命令就会变成 

nc -uz -v -w 3 10.3.3.3 22


聊天服务器


机器A的终端开启端口侦听,机器B连接A侦听的端口并向A发送数据。具体过程如下:

63机器相当于一个简易的命令行聊天服务器,64机器相当于客户端的功能,默认使用 TCP 协议连接服务器


可以看到,63机器在本地开启一个侦听8000端口的服务,64机器连接63机器的8000端口,连接成功之后可以互相发送数据了


传输文件


机器A和机器B之间可以通过 nc 命令传输文件,具体步骤如下:

63机器作为服务器,侦听8000端口并重定向到 out.txt 文件,64机器连接63成功之后,自动把 input.txt 文件传输到服务器


创建后门


可以在系统中创建后门执行bash命令的服务,因为涉及到系统安全性问题,所以生产环境要慎用,不过平时在内网开发环境中用来测试的话就很方便了,具体的使用步骤如下:

上面的例子中,63机器开启端口 8000 的本地服务,服务会使用 /bin/bash 执行收到的命令,64机器客户端连上63机器后,输入任意的命令,都相当于在63机器上执行,命令结果返回给64机器


说明:

-e 选项默认使用的是 /bin/bash 执行命令, 这里的 -e 也可以换成 -c ,唯一区别是 -c 默认使用的是 /bin/sh 执行命令


远程执行脚本


nc 支持远程执行 shell 脚本和 lua 脚本


  • shell 脚本 脚本 s.sh 脚本内容如下:

#!/bin/shecho "this is a shell programming..."

服务器端

nc -l 192.168.70.63 8000 --sh-exec ./s.sh

客户端

[cgyx@cghost35 ~]$ nc 192.168.70.63 8000this is a shell programming...


  • lua 脚本 脚本 t.lua 内容如下:

x = 5y = 3h = x + yprint('this is a lua test..h:',h)

服务器端

nc -l 192.168.70.63 8000 --lua-exec t.lua

客户端

[cgyx@cghost35 ~]$ nc 192.168.70.63 8000this is a lua test..h: 8



Web服务器


nc 可以当做简易的 web 服务器,现服务器本地有一个 index.html 文件,内容如下


HTTP/1.0 200 OK
<html>
<head>
<title>Test Page</title>
</head>
<body>
<p>This is a Netcat Basic HTTP server!</p>
</body>
</html>


服务器执行以下命令监听8080端口

nc -k -l 192.168.70.63 8080 < index.html

 

打开浏览器,地址栏输入以下内容回车

192.168.70.63:8080


具体效果如下图:



此时,服务器端的输出如下:



注意:-k 选项是指监听模式接受多个连接,如果没有指定 -k 选项的话,浏览器访问一次,服务器就会退出了


作为浏览器


nc 不仅可以当作web服务器,还可以当作浏览器发送HTTP请求


以百度首页为例, 输入 nc www.baidu.com 80,回车之后,再次输入 GET / HTTP/1.0 再次敲击两次回车,即可获得百度首页的 HTML 文档内容,由于百度首页HTML太长,下面的例子只是文档的部分内容


[cgyx@cghost35 ~]$ nc www.baidu.com 80GET / HTTP/1.0
HTTP/1.0 200 OKAccept-Ranges: bytesCache-Control: no-cacheContent-Length: 14615Content-Type: text/htmlDate: Thu, 16 Jul 2020 06:49:16 GMTP3p: CP=" OTI DSP COR IVA OUR IND COM "P3p: CP=" OTI DSP COR IVA OUR IND COM "Pragma: no-cacheServer: BWS/1.1



查找运行在端口上的服务


nc 可以扫描指定IP上指定端口是否开启,那能否查找到指定IP上运行于指定端口上的服务呢?答案是肯定的,以下的例子是获取指定IP上 22 号端口上运行的服务

[root@ecs-centos-7 ~]# nc -v -n 10.3.3.3 22Ncat: Version 7.50 ( https://nmap.org/ncat )Ncat: Connected to 10.3.3.3 22.SSH-2.0-OpenSSH_6.6.1

从上面的例子中可以看出,机器(IP:10.3.3.3)上22号端口上运行的是SSH服务


访问控制


服务器端可以只接受指定的IP的连接或者只拒绝指定IP的连接
注意 :
1、下面的例子中 增加 -k 选项是让服务器接受多个连接,避免接受一个客户端连接就退出了

2、--lua-exec t.lua 为了客户端连上服务器之后返回一个打印字符串,来表示连接服务器成功


  • 只允许指定的IP

只允许IP为 192.168.62 客户端连接

nc -k -l 192.168.63 8000 --lua-exec t.lua --allow 192.168.62

只允许IP为 192.168.62 和 192.168.64 的客户端连接

nc -k -l 192.168.63 8000 --lua-exec t.lua --allow 192.168.62 --allow 192.168.64

只允许内网IP段的客户端连接

nc -k -l 192.168.63 8000 --lua-exec t.lua --allow 192.168.62-64

从文件中获取允许访问的IP地址列表

[cgyx@cghost35 ~]$ cat allow.txt192.168.70.62192.168.70.64[cgyx@cghost35 ~]$ nc -k -l 8000 --lua-exec t.lua --allowfile allow.txt


  • 只拒绝指定的IP

只拒绝IP为 192.168.62 的客户端

nc -k -l 192.168.63 8000 --lua-exec t.lua --deny 192.168.62

只拒绝IP为 192.168.62 和 192.168.64 的客户端连接

nc -k -l 192.168.63 8000 --lua-exec t.lua --deny 192.168.62 --deny 192.168.64

只拒绝内网IP段的客户端连接

nc -k -l 192.168.63 8000 --lua-exec t.lua --deny 192.168.62-64

从文件中获取拒绝访问的IP地址列表

[cgyx@cghost35 ~]$ cat deny.txt192.168.70.62192.168.70.64[cgyx@cghost35 ~]$ nc -k -l 8000 --lua-exec t.lua --denyfile deny.txt







一口君个人微信


添加一口君个人微信即送Linux、嵌入式等独家入门视频


→ 精选技术资料共享

→ 高手如云交流社群





本公众号全部原创干货已整理成一个目录,请在公众号里回复「m」获取!或者关注点击左下角「干货」!

推荐阅读



【1】如何在Linux上恢复误删除的文件或目录
【2】三剑客grep、sed和awk用法
【3】一文讲懂什么是vlan、三层交换机、网关、DNS、子网掩码、MAC地址
【4】详解实时查看网卡流量的几款工具
【5】如何在Linux上恢复误删除的文件或目录
【6】如何高效阅读代码?Linux大神拍了拍你并教给你这三个步骤
【7】500亿美元!英伟达收购Arm倒计时!月底Arm或将属于美国!
【8】机房布线的最高境界 | 最后的暗黑系,真是亮瞎眼
【9】手把手教Linux驱动1-模块化编程
【10】手把手教Linux驱动2-模块参数param和符号导出export用法


5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「1024」,即可免费获取!!




: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存