网络工具nc的常见功能和用法

前言

nc 是一个Linux环境下常用的工具命令,可以用来帮助开发者查询和解决网路问题,通常被认为是 NetCat 工具的缩写,在网络工具中有"瑞士军刀"的美誉。

nc 在Linux环境下常常是自带的,如果你使用的Linux发行版本没有这个工具也可以自行安装,比如在CentOS上的安装命令就是 yum install nc -y,并且这个工具在Windows上也可以直接下载使用,下载页面地址为 netcat,简约而不简单。

一、nc的用法

nc是一个强大的网络工具,下面列举几个常见的用法。

1.测试udp端口是否可用

如果是测试某个IP地址地址是否可以访问,通常会使用 ping 命令,执行之后如果可以到达就会得到数据反馈:

复制代码
PING 10.110.30.104 (10.110.30.104) 56(84) bytes of data.
From 172.26.153.116 icmp_seq=1 Destination Host Unreachable
From 172.26.153.116 icmp_seq=2 Destination Host Unreachable
From 172.26.153.116 icmp_seq=5 Destination Host Unreachable
From 172.26.153.116 icmp_seq=6 Destination Host Unreachable
From 172.26.153.116 icmp_seq=7 Destination Host Unreachable
From 172.26.153.116 icmp_seq=8 Destination Host Unreachable
ping: sendmsg: No route to host
From 172.26.153.116 icmp_seq=9 Destination Host Unreachable
From 172.26.153.116 icmp_seq=10 Destination Host Unreachable
^C
--- 10.110.30.104 ping statistics ---
11 packets transmitted, 0 received, +8 errors, 100% packet loss, time 10223ms

想要测试一个tcp端口是否可以访问,映入脑海的第一个命令应该是telnet,直接在IP后面加空格和端口就可以了:

复制代码
albert@home-pc:~$ telnet 82.156.125.169 22
Trying 82.156.125.169...
Connected to 82.156.125.169.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4

如果想测试UDP端口是否可达使用telnet就不行了因为它是一种基于TCP的应用层协议,用来测试UDP端口会因为长时间没有反应而超时:

复制代码
albert@home-pc:~$ telnet 82.156.125.169 666
Trying 82.156.125.169...
telnet: Unable to connect to remote host: Connection refused

这时用 nc 命令就可以解决了,命令格式为 nc -nvuz ip port

复制代码
albert@home-pc:~$ nc -nvuz 82.156.125.169 666
Connection to 82.156.125.169 666 port [udp/*] succeeded!

2.端口扫描

这实际实际上是对上一个应用的扩展,使用 nc 命令可以指定一个端口范围,用来扫描多个端口是否可用:

复制代码
albert@home-pc:~$ nc -nvz 82.156.125.169 20-24
nc: connect to 82.156.125.169 port 20 (tcp) failed: Connection refused
nc: connect to 82.156.125.169 port 21 (tcp) failed: Connection refused
Connection to 82.156.125.169 22 port [tcp/*] succeeded!
nc: connect to 82.156.125.169 port 23 (tcp) failed: Connection refused
nc: connect to 82.156.125.169 port 24 (tcp) failed: Connection refused

3.一对一聊天

使用 nc 命令可以监听一个端口作为服务器,然后在另一台机器上启动 nc 作为客户端发数据:

复制代码
# 启动服务器
[root@VM-0-3-centos ~]# nc -l 1314
# 以下为接收到客户端发来的数据
12
client send msg

# 启动客户端
albert@home-pc:~$ nc 82.156.125.169 1314
# 以下为输入的数据
12
client send msg

4. 传输文件

这个用法是对上一种用法的扩展,通过重定向将文件内容通过网络传输:

复制代码
# 服务端将socket内容保存到w文件中
[root@VM-0-3-centos ~]# nc -l 1314 > w.txt

albert@home-pc:~$ cat w.txt
w
-
r
x
d
# 客户端将w.txt文件内容发送给服务器
albert@home-pc:~$ nc 82.156.125.169 1314 < w.txt
albert@home-pc:~$

客户端运行完 nc 命令之后就会退出,服务器端的 nc 命令也会结束,w.txt 文件的内容就传送过去了。

5. 端口转发

这其实也是传输数据的命令的一个变种,使用 -c 参数可以完成数据转发:

复制代码
[root@VM-0-3-centos ~]# nc -l 520 -c "nc 82.156.125.169 1314"

执行命令之后,发送到本机 520 端口的数据就会被转发到 IP 为82.156.125.169的1314端口上了。

二、总结

  • nc -nvuz ip port 可以检测指定IP的UDP端口能否访问,如果是TCP端口去掉 -u 选项就可以了

  • nc -l port 可以启动一个本地服务器,接受发往指定端口的数据,并打印到控制台

  • nc -l port > filename 可以启动一个本地服务器,接受发往指定端口的数据,并保存到名为 filename 的文件中

  • nc -l port -c "nc ip new_port" 可以启动一个本地服务器,接受发往指定端口的数据,并转发到ip:new_port的机器上