nc(瑞士军刀)
网络工具界的“瑞士军刀” nc(netcat),它短小精悍,是网络调试利器
nc
命令(netcat)端口侦听、端口连接、端口测试、端口扫描,功能大致跟ncat
类似,但有端口扫描功能。
1、查看端口是否被占用(ncat)
# nc -l 80 Ncat: bind to :::80: Address already in use. QUITTING.
2、端口扫描
例如需要扫描某个机器上21-30哪些端口是开放的:
报错
nc -n 127.0.0.1 -z 1230-1234 -v Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connection refused.
在CentOS7.X中使用yum install -y nc
安装的并不是netcat而是nmap-ncat,并且通过软链接的方式链接为nc
命令,但实际是ncat
命令,在CentOS6.4中使用yum install -y nc
安装的是nc
命令(netcat)
# ll `which nc` lrwxrwxrwx 1 root root 22 9月 27 11:21 /usr/bin/nc -> /etc/alternatives/nmap # ll /etc/alternatives/nmap lrwxrwxrwx 1 root root 13 9月 27 11:21 /etc/alternatives/nmap -> /usr/bin/ncat # ll /usr/bin/ncat -rwxr-xr-x 1 root root 380184 8月 9 2019 /usr/bin/ncat
源码安装netcat
wget http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download -O netcat-0.7.1.tar.gz tar zxf netcat-0.7.1.tar.gz cd netcat-0.7.1 ./configure make && make install which netcat /usr/local/bin/netcat cp /root/netcat-0.7.1/src/netcat /usr/local/bin/ 为netcat做一个软连接(先删除之前的) ln -s /usr/local/bin/netcat /usr/bin/nc
扫描本机上22-90哪些端口是开放的
nc -n 127.0.0.1 -z 22-90 -v 127.0.0.1 22 (ssh) open 127.0.0.1 25 (smtp) open 127.0.0.1 80 (http) ope
-n说明直接使用ip地址,而不使用域名,-z指定端口范围,-v输出详细信息
扫描某个端口
nc -zv ip port socat - tcp:ip:80
3、TCP/UDP连接测试
nmap-ncat: nc -lk 1234 (监听1234端口,good boy手敲) good boy netcat : listen for inbound: nc -l -p port [options] [hostname] [port] ... 如: nc -l -p 1234
新建一个窗口连接看效果
nc 127.0.0.1 1234 good boy 或者 # telnet 192.168.40.132 1234 Trying 192.168.40.132... Connected to 192.168.40.132. Escape character is '^]'. good boy
连接本地地址1234端口,这个过程中就可以抓包,分析TCP的三次握手了。
除此之外,你还可以在建立好的连接之间发送消息(简单的聊天功能),让你分析更多!
默认情况,它创建的是TCP连接,而使用-u(UDP)参数可以测试UDP连通性。
$ nc -v -u 182.3.226.35 80 Connection to 182.3.226.35 80 port [udp/http] succeeded!
除此之外,还有很多参数用于调试,例如:
-
-b 允许广播消息
-
-D 开启socket调试模式
-
-d 禁止从标准输入读取内容
-
-k 客户端退出后,保持连接(最新版本已经没该选项)
# 连接8089端口,连接上后,可以开始输入消息,然后按回车发送 nc 127.0.0.1 8089 # 直接把 test.txt的内容发送过去 nc 127.0.0.1 8089 < test.txt # 发送一串内容 ehco "hello" | nc 127.0.0.1 8089 # -v 表示连接时输出一些详细的连接信息 nc -v 127.0.0.1 8089 # -z 表示只是扫描端口,不发送任何数据 nc -z 127.0.0.1 8089 # -G 5 表示尝试连接该端口,超过5秒没连接上就判定超时 nc -G 5 127.0.0.1 8089 # -p 表示 以指定的端口去连接,下面指定用8888端口去连接目标端口 nc -p 88 127.0.0.1 8090 # -s 表示以指定的 ip作为sourceIp去连接,该ip要是自己网卡的某个ip,不然会立刻返回 nc -s 172.20.6.3 -p 88 127.0.0.1 8090
4、HTTP连接测试
连接后,输入HEAD / HTTP/1.1或HEAD / HTTP/1.0,然后输入两个回车,可查看web服务器相关信息。
nc www.baidu.com 80 HEAD / HTTP/1.1 HTTP/1.1 302 Found Connection: Keep-Alive Content-Length: 17931 Content-Type: text/html Date: Sun, 23 Jun 2019 13:52:12 GMT Etag: "54d9748e-460b" Server: bfe/1.0.8.18
5、数据传输
还是利用前面的连接,借助重定向符可以进行文件传输,例如服务端监听,并把内容输出到out.txt:
nc -l 1234 > out.txt
而客户端连接:
nc 127.0.0.1 1234 < in.txt in.txt是已有的文件
这样客户端in.txt的内容,就会传输到out.txt
6、网络测试
测试两个主机间的网络速度(常用iperf3工具来完成),nc也是可以帮忙的:
-
server端启用
nc -vvlnp ${server_port} >/dev/null
,或者-4
指定只使用ipv4的方式。 -
client端连接
dd if=/dev/zero bs=1M count=1K | nc ${server_ip} ${server_port}
#服务端监听: $ nc -vl 1234 >/dev/null
其中重定向到/dev/null,表示将数据丢弃。
然后在另一台主机上执行:
$ dd if=/dev/zero bs=1M count=10 | nc -vn 127.0.0.1 1234 Connection to 127.0.0.1 1234 port [tcp/*] succeeded! 10+0 records in 10+0 records out 10485760 bytes (10 MB, 10 MiB) copied, 0.0333675 s, 314 MB/s
dd拷贝数据,这里从/dev/zero拷贝数据0,且一次1M,拷贝10次,最后通过nc命令发送到服务端。结束后,就可以看到统计信息了。
7、使用 nc 扫描端口
# 扫描百度 8000-9000 区间的端口。加上-G是因为百度的端口如果不可用不会立即返回,而是阻塞在那里,所以带上超时条件 nc -zv -G 1 www.baidu.com 8000-9000 # nc 好像只能指定端口区间段,不过我们可以写个简单的shell脚本来实现指定扫描某些端口的功能 # 下面的shell 脚本会依次扫描 80 443 8080 9000 端口 ports=(80 443 8080 9000) for port in ${ports[@]} do nc -zv -G 1 www.baidu.com $port done