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也是可以帮忙的:

  1. server端启用nc -vvlnp ${server_port} >/dev/null,或者-4指定只使用ipv4的方式。

  2. 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

 

posted @ 2020-10-12 11:12  凡人半睁眼  阅读(944)  评论(0编辑  收藏  举报