您当前的位置:首页 > 电脑百科 > 网络技术 > 网络软件

请收好Netcat网络工具中的瑞士军刀,从此故障诊断不用愁!

时间:2020-04-10 09:50:59  来源:  作者:

Netcat 号称 TCP/IP 的瑞士军刀并非浪得虚名,以体积小(可执行 200KB)功能灵活而著称,在各大发行版中都默认安装,你可以用它来做很多网络相关的工作,熟练使用它可以不依靠其他工具做一些很有用的事情。

最初作者是叫做“霍比特人”的网友 Hobbit hobbit@avian.org 于 1995 年在 UNIX 上以源代码的形式发布,Posix 版本的 netcat 主要有 GNU 版本的 netcat 和 OpenBSD 的 netcat 两者都可以在 debian/ubuntu 下面安装,但是 windows 下面只有 GNU 版本的 port。

不管是程序员还是运维,熟悉这个命令都可以让很多工作事半功倍,然而网上基本 90% 的 netcat 文章说的都是老版本的 OpenBSD 的 netcat,已经没法在主流 linux 上使用了,所以我们先要检查版本:

在 debian/ubuntu 下面:

readlink -f $(which nc)

看看,结果会有两种:

  • /bin/nc.traditional: 默认 GNU 基础版本,一般系统自带。
  • /bin/nc.openbsd: openbsd 版本,强大很多。

都可以用 apt-get install nc-traditional 或者 apt-get install nc-openbsd 来选择安装。不管是 GNU 版本还是 OpenBSD 版本,都有新老的区别,主要是传送文件时 stdin 发生 EOF 了,老版本会自动断开,而新的 gnu/openbsd 还会一直连着,两年前 debian jessie 时统一升过级,导致网上的所有教程几乎同时失效。

下面主要以最新的 GNU 版本为主同时对照更强大的 openbsd 版本进行说明。

端口测试

你在服务器 A主机(192.168.1.2) 上面 8080 端口启动了一个服务,有没有通用的方法检测服务的 TCP 端口是否启动成功?或者在 B 主机上能不能正常访问该端口?

进一步,如果而 A 主机上用 netstat -an 发现端口成功监听了,你在 B 主机上的客户端却无法访问,那么到底是服务错误还是网络无法到达呢?我们当然可以在 B 主机上用 telnet 探测一下:

telnet 192.168.1.2 8080

但 telnet 并不是专门做这事情的,还需要额外安装,所以我们在 B 主机上用 netcat:

nc -vz 192.168.1.2 8080

即可,v 的意思是显示多点信息(verbose),z 代表不发送数据。那么如果 B 主机连不上 A 主机的 8080 端口,此时你就该检查网络和安全设置了,如果连的上那么再去查服务日志去。

nc 命令后面的 8080 可以写成一个范围进行扫描:

nc -v -v -w3 -z 192.168.1.2 8080-8083

两次 -v 是让它报告更详细的内容,-w3 是设置扫描超时时间为 3 秒。

传输测试

你在配置 iptable 或者安全组策略,禁止了所有端口,但是仅仅开放了 8080 端口,你想测试一下该设置成功与否怎么测试?安装个 Nginx 改下端口,外面再用 chrome 访问下或者 telnet/curl 测试下??还是 Python -m 启动简单 http 服务 ?其实不用那么麻烦,在需要测试的 A 主机上:

nc -l -p 8080

这样就监听了 8080 端口,然后在 B 主机上连接过去:

nc 192.168.1.2 8080

两边就可以会话了,随便输入点什么按回车,另外一边应该会显示出来,注意,openbsd 版本 netcat 用了 -l 以后可以省略 -p 参数,写做:nc -l 8080 ,但在 GNU netcat 下面无法运行,所以既然推荐写法是加上 -p 参数,两个版本都通用。

老版本的 nc 只要 CTRL+D 发送 EOF 就会断开,新版本一律要 CTRL+C 结束,不管是服务端还是客户端只要任意一边断开了,另一端也就结束了,但是 openbsd 版本的 nc 可以加一个 -k 参数让服务端持续工作。

那么你就可以先用 nc 监听 8080 端口,再远端检查可用,然后又再次随便监听个 8081 端口,远端检测不可用,说明你的安全策略配置成功了,完全不用安装任何累赘的服务。

测试 UDP 会话

两台主机 UDP 数据发送不过去,问题在哪呢?你得先确认一下两台主机之间 UDP 可以到达,这时候没有 nginx 给你用了,怎么测试呢?用 python 写个 udp 的 echo 服务??运维不会认你写的工具的,即使连不通他也会认为你的程序有 bug,于是 netcat 又登场了,在 A 主机上:

nc -u -l -p 8080

监听 udp 的 8080 端口,然后 B 主机上连上去:

nc -u 192.168.1.2 8080

然后像前面测试 tcp 的方法进行检测,结束了 CTRL+C 退出,看看一边输入消息另外一边能否收到,收得到的话可能是你自己的服务原因,收不到的话把 nc 测试结果扔给运维/系统管理员,让他们赶快检查网关和防火墙配置,系统自带的工具测试的结果,既简单又权威。

文件传输

你在一台 B 主机上想往 A 主机上发送一个文件怎么办?不能用 scp / szrz 的话?继续 python 写个 http 上传?装个 ftpd 服务?不用那么麻烦,在 A 主机上监听端口:

nc -l -p 8080 > image.jpg

然后在 B 主机上:

nc 192.168.1.2 8080 < image.jpg

netcat 嘛,就是用于通过网络把东西 cat 过去,注意,老版本 GNU / OpenBSD 的 netcat 再文件结束(标准输入碰到 EOF),发送文件一端就会关闭连接,而新版本不会,你需要再开个窗口到 A 主机上看看接收下来的文件尺寸和源文件比较一下判断传输是否结束。

当传输完成后,你再任意一端 CTRL+C 结束它。对于新版 OpenBSD 的 netcat 有一个 -N 参数,可以指明 stdin 碰到 EOF 就关闭连接(和老版本一致),我们写作:

/bin/nc.openbsd -N 192.168.1.2 8080 < image.jpg

你机器上的 nc 命令有可能指向 /bin/nc.traditional 或者 /bin/nc.openbsd 任意一个,这里显示指明调用 openbsd 版本的 netcat。

这样在 openbsd 新版本的 netcat 中使用 -N参数,就不需要再开个终端去手工检查传输是否完成,传输结束了就会自动退出。其实 GNU 版本的 netcat 也有可以加个 -q0 参数,达到和 openbsd 版本 -N 的效果:

/bin/nc.traditional -q0 192.168.1.2 8080 < image.jpg

只不过是 Linux 下面最新的 GNU netcat,对应 Windows 版本 没有该参数,所以从 Windows 传文件过去时,少不了再开个终端看一下进度,如果是 Linux 端发送就没问题了。通过管道协作,搭配 tar 命令,还可以方便的传一整个目录过去,有兴趣可以自己研究。

使用 netcat 这个系统默认安装的工具进行文件传输,可以算作你保底的手段,当 scp/ftp 都没法使用的情况下,你的一个杀手锏。

网速吞吐量测试

最简单的方法,GNU 版本的 netcat 加上 -v -v 参数后,结束时会统计接收和发送多少字节,那么此时 A 主机上显示运行 GNU 版本的 nc 监听端口:

/bin/nc.traditional -v -v -n -l -p 8080 > /dev/null

加 n 的意思是不要解析域名,避免解析域名浪费时间造成统计误差,然后 B 主机上:

time nc -n 192.168.1.2 8080 < /dev/zero

回车后执行十秒钟按 CTRL+C 结束,然后在 A 主机那里就可以看到接收了多少字节了,此时根据 time 的时间自己做一下除法即可得知,注意 GNU 的 netcat 统计的数值是 32 位 int,如果传输太多就回环溢出成负数了。

对于 OpenBSD 版本的 nc 我们可以用管道搭配 dd 命令进行统计,服务端运行:

nc -l -p 8080 > /dev/null

客户端运行 dd 搭配 nc:

dd if=/dev/zero bs=1MB count=100 | /bin/nc.openbsd -n -N 192.168.1.2 8080

结束以后会有结果出来,注意这里使用了 -N 代表 stdin 碰到 EOF 后就关闭连接,这里凡是写 nc 命令的地方,代表 GNU/OpenBSD 任意版本的 netcat 都可以,显示的指明路径,就代表必须使用特定版本的 netcat,上条命令等效的 GNU 版本是:

dd if=/dev/zero bs=1MB count=100 | /bin/nc.traditional -n -q0 192.168.1.2 8080

其实上面两种方法都把建立连接的握手时间以及 TCP 窗口慢启动的时间给计算进去了,不是特别精确,最精确的方式是搭配 pv 命令(监控统计管道数据的速度),在 A 主机运行:

nc -l -p 8080 | pv

然后再 B 主机运行:

nc 192.168.1.2 8080 < /dev/zero

此时 A 主机那端持续收到 B 主机发送过来的数据并通过管道投递给 pv 命令后,你就能看到实时的带宽统计了,pv 会输出一个实时状态:

353MiB 0:00:15 [22.4MiB/s] [ <=> ]

让你看到最新的带宽吞吐量,这是最准确的吞吐量测试方法,在不需要 iperf 的情况下,直接使用 nc 就能得到一个准确的数据。

系统后门

假设你用串口登录到 A 主机,上面十分原始,包管理系统都没有,sshd/telnetd 都跑不起来,这时候你想用 B 主机通过网络登录 A 主机有没有办法?

GNU 版本的 netcat 有一个 -e 参数,可以在连接建立的时候执行一个程序,并把它的标准输入输出重定向到网络连接上来,于是我们可以在 A 主机上 -e 一下 bash:

/bin/nc.traditional -l -p 8080 -e /bin/bash

按回车打开系统后门,然后再 B 主机那里照常:

nc 192.168.1.2 8080

你就可以在 B 主机上登录 A 主机的 shell 了,操作完成 CTRL+C 结束。

对于 openbsd 版本的 netcat,-e 命令被删除了,没关系,我们可以用管道来完成,和刚才一样,在 A 主机上:

mkfifo /tmp/f

cat /tmp/f | /bin/bash 2>&1 | /bin/nc.openbsd -l -p 8080 > /tmp/f

然后 B 主机和刚才一样:

nc 192.168.1.2 8080

即可访问,用完注意将 /tmp/f 这个 fifo 文件删除。

结束

netcat 就是可以在命令行直接的方式操作 tcp/udp 进行原始的:监听,连接,数据传输等工作。然后搭配管道,实现灵活多样的功能,或者进行各种网络测试。

其实上面几个例子,并不是说明 “netcat 可以干这些事情”而是通过举例开一下脑洞,看看搭配管道的 netcat 究竟有多强。

还有很多其他用法,比如你可以用 netcat + shell script 写一个 http 服务器,使用 fifo 搭配两层 nc 可以实现 tcp 端口转发,搭配 openssl 命令行工具和 nc 加管道可以把 ssl 的套接字解码并映射成裸的 socket 端口供没有 ssl 功能的工具访问。

当然你要说,这么多复杂的用法你记不住,大部分你都可以用专业软件来代替,那至少你可以先尝试使用 nc 来做 tcp/udp 端口测试,不要再用 telnet/chrome 来测试端口是否可用了,后者太过业余。其他功能可作为备份手段,在极端恶劣的环境下使用一下,也许能帮助到你很多;再你有心情的情况下可以研究下如何使用管道搭配其他工具进行一些高阶操作就行。



Tags:Netcat   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Netcat 号称 TCP/IP 的瑞士军刀并非浪得虚名,以体积小(可执行 200KB)功能灵活而著称,在各大发行版中都默认安装,你可以用它来做很多网络相关的工作,熟练使用它可以不依靠其他工具...【详细内容】
2020-04-10  Tags: Netcat  点击:(93)  评论:(0)  加入收藏
netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用netcat命令所能完成的事情令人惊讶。ne...【详细内容】
2019-06-28  Tags: Netcat  点击:(337)  评论:(0)  加入收藏
▌简易百科推荐
说到远程控制,首先你会想到的是什么?是TeamViewer 还是向日葵?抑或是QQ远程还是anydesk?对,就在不久前,我们熟知的都是以上的产品,但是只2020年开始,一款新的远控产品ToDesk进入到我...【详细内容】
2021-12-27  网管世界    Tags:ToDesk   点击:(4)  评论:(0)  加入收藏
# 1. nps-npc1.1 简介nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh...【详细内容】
2021-12-22  大数据推荐杂谈    Tags:内网穿透   点击:(8)  评论:(0)  加入收藏
“磨刀不误砍柴工”。 优秀的工具有助于提高工作效率,安全工程师也需要优秀的安全软件来提高工作效率。 在具体的工作场景中,有很多种选择,这里有10种开源的免费安全工具,不仅可...【详细内容】
2021-11-23  山东云管家官方    Tags:安全工具   点击:(33)  评论:(0)  加入收藏
火绒安全软件是一款小巧精悍、独立纯粹的国产安全软件.有很多网友都下载安装了火绒安全软件使用.那么火绒安全软件怎么样呢,火绒安全软件好用吗?下面小编就给大家分析下详解...【详细内容】
2021-11-03  装机吧    Tags:火绒   点击:(34)  评论:(0)  加入收藏
背景上次给大家介绍了实现基础的运维系统功能&mdash;webssh,今日书接上回,继续给大家介绍一个web远程ssh终端录像回放功能。 一、思路网上查了一下资料,搜索了一下关于实现webs...【详细内容】
2021-10-13  小堂运维笔记    Tags:ssh终端   点击:(40)  评论:(0)  加入收藏
QuickPing快速Ping扫描器QuickPing,哪些地址已经使用,哪些可用,图形界面非常直观,而且可以导出列表,该软件体积很小,可以快速的知道网段内哪些主机已经开启,ping成功的即显示出不同...【详细内容】
2021-10-11  海南弱电李工    Tags:网管   点击:(66)  评论:(0)  加入收藏
1、每个项目根据现场的网络环境不同,需要定义不同的IP地址,通过此工具可以快速配置。而且有助于做项目实施资料。2、以前连接过的wifi密码自带记忆功能,通过检索对应的WiFi名字...【详细内容】
2021-10-08  IT游侠    Tags:局域网管理   点击:(49)  评论:(0)  加入收藏
01概述无论是开发还是测试,在工作中经常会遇到需要抓包的时候。本篇文章主要介绍如何在各个平台下,高效的抓包。目前的抓包软件总体可以分为两类: 一种是设置代理抓取http包,比...【详细内容】
2021-09-28  小码哥聊软件测试    Tags:网络抓包   点击:(103)  评论:(0)  加入收藏
Fiddler 简介Fiddler 是位于客户端和服务器端的 HTTP 代理 目前最常用的 http 抓包工具之一 功能非常强大,是 Web 调试的利器关注+转发+私信【软件测试】领取Fiddler安装包和...【详细内容】
2021-09-28  土豆聊软件测试    Tags:抓包工具   点击:(63)  评论:(0)  加入收藏
前言上次有写过一篇《20张图深度详解MAC地址表、ARP表、路由表》的文章,里面有提到了MAC地址表。那么什么是MAC地址表?MAC地址表有什么作用?MAC地址表里面包含了哪些要素?今天...【详细内容】
2021-09-09  网络工程师笔记    Tags:MAC地址表   点击:(76)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条