当前位置: 首页 > Linux

少年!用好这把瑞士军刀,从此再也不用为网络故障诊断发愁了!

时间:2023-04-07 01:19:07 Linux

Netcat所谓TCP/IP的瑞士军刀不是白来的。它以体积小(可执行文件200KB)和功能灵活而著称。它默认安装在所有主要发行版中。你可以用它来做很多与网络相关的工作,熟练使用它可以在不依赖其他工具的情况下做一些有用的事情。原作者是名为“霍比特人”的网友霍比特人hobbit@avian.org。1995年在UNIX上以源代码的形式发布,Posix版本的netcat主要包括GNU版本的netcat和OpenBSD的netcat,两者都可以在debianInstall/ubuntu下找到,但只有GNU版本的port下视窗。无论是程序员还是运维人员,熟悉这个命令都可以让很多工作更有效率。但是网上基本上90%的netcat文章都是OpenBSD的netcat的老版本,在主流linux上已经不能用了,所以我们先从查看版本开始:debian/ubuntu下:readlink-f$(whichnc)看,会有两个结果:/bin/nc.traditional:默认的GNUbasic版本,通常是系统自带的。/bin/nc.openbsd:openbsd版本,功能更强大。可以使用apt-getinstallnc-traditional或apt-getinstallnc-openbsd选择安装。不管是GNU版本还是OpenBSD版本,新旧都有区别,主要是stdin传输文件时出现EOF,老版本会自动断开连接,而新的gnu/openbsd会一直连接.两年前debianjessie统一升级的时候,导致网上所有教程几乎同时失效。下面主要关注最新的GNU版本,并与功能更强大的openbsd版本进行对比。端口测试你在服务器A主机(192.168.1.2)的8080端口启动了一个服务。有没有通用的方法检查服务的TCP端口是否启动成功?或者在主机B上能正常访问端口吗?再者,如果在主机A上使用netstat-an发现端口监听成功,但是你在主机B上的客户端无法访问,是服务错误还是网络不通?当然我们可以在主机B上使用telnet检测:telnet192.168.1.28080但是telnet并不是专门用于这个的,需要额外安装,所以我们在主机B上使用netcat:nc-vz192.168.1.28080,v表示显示多点信息(verbose),z表示不发送数据。那么如果主机B无法连接到主机A的8080端口,此时就应该检查一下网络和安全设置。如果已连接,则检查服务日志。nc命令后面的8080可以写成扫描范围:nc-v-v-w3-z192.168.1.28080-8083两次-v是让它上报更详细的内容,-w3是设置扫描超时时间到3秒。传输测试你在配置iptable或者安全组策略,所有端口都禁止了,但是只有8080端口是开放的,你想怎么测试是否设置成功?安装nginx并更改端口,然后用chrome访问或用telnet/curl测试??或者python-m来启动一个简单的http服务?其实大可不必这么麻烦。在需要测试的A主机上:nc-l-p8080这样会监听8080端口,然后连接到B主机上:nc192.168.1.28080双方就可以对话了,随便输入什么然后按按Enter,应显示另一侧。注意openbsd版本的netcat在使用-l后可以省略-p参数,写成:nc-l8080,但是在GNUnetcat下无法运行,所以推荐的写法是加上-p参数,common到两个版本。老版本的nc只要CTRL+D发送EOF就会断开,新版本必须CTRL+C终止。不管是服务端还是客户端,只要其中一方断开,另一端也会结束,但是openbsd版本的nc可以加一个-k参数让服务端继续工作。那么可以先用nc监听8080端口,然后远程检查是否可用,然后再监听一个随机的8081端口。如果远程检查不可用,说明你的安全策略配置成功,根本不需要安装任何繁琐的服务。测试UDP会话。两台主机的UDP数据无法发送。问题是什么?您必须确保两台主机之间的UDP可以到达。这个时候没有nginx可以给你用。如何测试?用python写一个udpecho服务??运维不会认你写的工具,即使连不上他也会认为你的程序有bug,于是netcat又出现了,在A主机上:nc-u-l-p8080监听udp的8080端口,然后连接主机B:nc-u192.168.1.28080然后像之前测试tcp的方法一样测试,CTRL+C退出,看对方能不能收到消息输入它。如果接收到,可能是你自己的服务原因,如果接收不到,把nc测试结果丢给运维/系统管理员,让他们赶紧检查一下网关和防火墙配置。系统自带工具测试结果简洁,权威。文件传输如果要从主机B向主机A发送文件,应该怎么做?不能使用scp/szrz吗?继续用python写一个http上传?安装ftpd服务?别这么麻烦,在主机A上监听端口:nc-l-p8080>image.jpg然后在主机B上:nc192.168.1.28080/dev/null加n表示不解析域名,避免浪费解析域名导致统计错误的时间,然后在主机B上:timenc-n192.168。1.28080/dev/null客户端运行ddwithnc:ddif=/dev/zerobs=1MBcount=100|/bin/nc.openbsd-n-N192.168.1.28080结束后会有结果注意这里用-N表示stdin遇到EOF后会关闭连接。这里写nc命令的地方,代表GNU/OpenBSD任何版本的netcat都可以,指明的指定路径表示必须使用特定版本的netcat。上述命令的等效GNU版本是:ddif=/dev/zerobs=1MBcount=100|/bin/nc。traditional-n-q0192.168.1.28080其实上面两种方式都计算了建立连接的握手时间和TCP窗口的慢启动时间,不是特别准确。最准确的方法是使用pv命令(监控统计管道数据速度),在主机A上运行:nc-l-p8080|pv然后在主机B上运行:nc192.168.1.28080]让你看到最新的带宽吞吐量这是最准确的吞吐量测试方法。不用iperf,直接用nc就可以得到一个准确的数据。系统后门假设你使用串口登录主机A,上面很原始,没有包管理系统,sshd/telnetd无法运行。这时候如果想用主机B通过网络登录主机A,有没有办法呢?GNU版的netcat有一个-e参数,可以在连接建立时执行一个程序,并将其标准输入输出重定向到网络连接,所以我们可以在主机A上运行bash:/bin/nc.traditional-l-p8080-e/bin/bash回车打开系统后门,然后照常进入主机B:nc192.168.1.28080,即可在主机B上登录主机A的shell,并且操作完成CTRL+C结束。对于openbsd版本的netcat,删除了-e命令,没关系,我们可以用管道补全,和之前一样,在A主机上:mkfifo/tmp/fcat/tmp/f|/bin/庆典2>&1|/bin/nc.openbsd-l-p8080>/tmp/f然后主机B和之前一样:nc192.168.1.28080可以访问,使用后请删除fifo文件/tmp/f。netcat的终局是可以直接在命令行操作tcp/udp,完成原本的任务:监听、连接、数据传输等,再匹配管道实现灵活多样的功能,或者进行各种网络测试。其实上面的几个例子并不是说“netcat可以做这些事情”,而是通过例子来打开脑洞,看看netcat用pipeline到底有多强大。其他用途还有很多,比如可以用netcat+shell脚本写一个http服务器,用fifo加两层nc实现tcp端口转发,用openssl命令行工具和nc加管道解码映射sslsockets裸socket端口,通过不带ssl功能的工具访问。当然你要说这么多复杂的用法你记不住,大半可以用专业的软件代替。至少可以先尝试用nc做tcp/udp端口测试,不要用telnet/chrome测试端口是否可用,后者太业余了。其他功能可以用作备份方法。在极其恶劣的环境中使用它可能对您有很大帮助;如果你有心情,你可以研究如何使用管道和其他工具来执行一些高级操作。转载自:魏一笑https://zhuanlan.zhihu.com/p/...