Linux 网络通信瑞士军刀 nc 命令使用

Linux 网络通信瑞士军刀 nc 命令使用

简介

netcat也就是nc被称为TCP/IP的瑞士军刀。以体积小,功能灵活著称。在各个发行版有默认安装,可以用来做很多网络相关的工作。它是一款拥有多种功能的 CLI 工具,可以用来在网络上读、写以及重定向数据。 它被设计成可以被脚本或其他程序调用的可靠的后端工具。同时由于它能创建任意所需的连接,因此也是一个很好的网络调试工具。甚至还可以作为简单的 TCP 代理。

我简单的列一下我使用过的常用的命令。

命令选项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
-g<网关>:设置路由器跃程通信网关,最多设置 8 个;
-G<指向器数目>:设置来源路由指向器,其数值为 4 的倍数;
-h:在线帮助;
-i<延迟秒数>:设置时间间隔,以便传送信息及扫描通信端口;
-l:使用监听模式,监控传入的资料;
-n:直接使用 ip 地址,而不通过域名服务器;
-o<输出文件>:指定文件名称,把往来传输的数据以 16 进制字码倾倒成该文件保存;
-p<通信端口>:设置本地主机使用的通信端口;
-r:指定源端口和目的端口都进行随机的选择;
-s<来源位址>:设置本地主机送出数据包的 IP 地址;
-u:使用 UDP 传输协议;
-v:显示指令执行过程;
-w<超时秒数>:设置等待连线的时间;
-z:使用 0 输入/输出模式,只在扫描通信端口时使用。

常用命令

传输测试

1
nc -l 8080

这个命令会监听本机 8080 端口,直到有 http 请求过来,然后显示出相关信息。

在主机 A 执行了这个命令之后,如果访问方式不是浏览器通过 HTTP 进行的,可以在主机 B 上面使用命令nc ip port连接过去,这样两台主机就可以通信了,随便输点什么,对方就会显示。

测试 UDP 会话

测试两台主机 UDP 连接是否可以通信时,在主机 A 上:

1
nc -u -l -p 8080

在主机 B 上面,连上去:

1
nc -u IP 8080

可以向之前 tcp 一样的方法进行检测。

端口测试

比如你在远程服务器 A 的某个端口启动了一个服务,但是你怎么测试这个服务通不通呢,这时你可以用本地机器 B 使用 nc 命令来测试。

1
nc -zv IP 8080

这个命令会告诉你,远端服务器的 8080 端口是否可以正常连接。nc 后面的端口也可以变成一个范围进行扫描。

1
nc -v -v -w3 -z IP 8080-8083

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

网络代理&端口转发

某些时候,我们可能需要一个网络代理来进行一些事情。在条件有限的情况下,可以做一个简单的代理。

现在假设有 A B C 三个主机。

在主机 A 上运行。

1
nc -l 8080 | nc B 8081

代表主机 A 监听自己的 8080 端口,并且把收到的请求都传送到主机 B 上。看命令可以知道把第一个命令的输出作为第二个命令的输入。但是此时代理是单向的,我们修改一下就可以变成双向。

1
2
mkfifo riba
nc -l 8080 0<riba | nc B 8081 1>riba

稍微解释一下这个命令,首先用 mkfifo 创建了一个双向管道,<> 是用来重定向的符号,0 在 linux 中代表标准输入,1 代标准输出,2 代表标准错误输出。那么这个命令就首先在 A 机器监听 8080 端口,把标准输入定向为管道,发送给 B, 然后 B 把自己接收的信息写进管道,标准输出到了管道,这样可以实现双向通信。

总结

暂时就用到这么多,先更到这。netcat 就是可以在命令行直接的方式操作 TCP 或者 UDP 进行原始的:监听,连接,数据传输等工作。然后搭配管道,实现灵活多样的功能。


最后修改于 2019-09-27

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。