工具-nc

Posted by 周思进 on October 27, 2019

场景:你写了一个TCP/UDP服务程序,想看看端口能不能正常收发数据,或者想看看端口不停接收数据包会不会异常等等,那是不是要编写个客户端程序来进行测试验证?

答案肯定是有一些工具可以直接方便你使用进行测试,比如nc工具,如上面想要测试服务端口不断收到数据包会怎么样,那执行如下命令即可:

while true; do echo “test” | nc 127.0.0.1 1234; done


下面简单对nc命令使用做些介绍,具体可以通过man手册查看。在执行下述命令过程中,都可以通过”netstat -anp | grep nc”来查看套接字状态。

1、起服务端口
nc -lk port
-l:表示起服务端口,而不是去连接
-k:服务端口有一个连接建立并关闭之后,仍旧保持服务端口开启,可继续接受新的连接

上述命名默认起tcp服务,如果想起udp服务,则增加选项u即可,即
nc -luk port


2、连接服务端口
nc dst_addr dst_port
上述是最简单的命令方式,指定目标地址,指定目标端口就行。
这里dst_addr 可以是ip地址形式,也可以是域名地址形式。
nc的-n选项(不进行DNS或服务查询)我其实没搞懂什么情况下需要使用,至少这里如果目标地址是域名地址形式,是不能使用-n选项的。

上述命令客户端源端口和源IP都是由内核选择,也可以通过-s和-p自行指定,如:
nc -s src_ip -p src_port dst_addr dst_port


3、端口扫描
nc -z dst_addr port
nc -z dst_addr port_start-port_end
这个我实际测试应该只能检测TCP端口,UDP端口都显示测试连接成功,实际系统并没有对应UDP端口开启。
这个过程可以加-v选项,可以输出更多信息,因为默认只有连接成功的打印会有输出,端口范围大还以为卡着没运行了呢…

PS:端口扫描日常可以用nmap工具进行端口扫描


4、文件传输
在服务端执行如下命令
nc -lk port > file.out
在客户端执行如下命令
nc dst_addr dst_port < file.in

这样客户端就将文件file.in发送到服务端保存到file.out文件中。


5、域名套接字
如果是域名套接字,则使用-U选项,如下
nc -lU /var/tmp/mysocket