乐趣区

关于运维:少年用好这把瑞士军刀从此网络故障诊断不用愁

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 来测试端口是否可用了,后者太过业余。其余性能可作为备份伎俩,在极其顽劣的环境下应用一下,兴许能帮忙到你很多;再你有情绪的状况下能够钻研下如何应用管道搭配其余工具进行一些高阶操作就行。

转自:韦易笑
https://zhuanlan.zhihu.com/p/…

退出移动版