名称
nc - 任意的TCP和UDp连接与监听工具
概要
nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol] [-x
proxy_address[:port]] [hostname] [port[s]]
描述
nc(或者netcat)的用途是被用来做关于TCP或者UDP协议的事情。可以打开TCP连接,发送UDP包,监听任意的TCP或者UDP端口,做端口扫描,处理IPv4或者IPv6。它不像telnet(1), nc脚本优美且在标准错误端会有单独的错误提示信息,而不是把这些错误发送给标准输出(telnet就这么干的)
通常这样使用:
.· 简单的TCP代理
.· 基于shell脚本的HTTP客户端和服务端
.· 网络程序测试
.· ssh的SOCKS或者HTTp代理命令
.· 等等
下面是所有选项:
-4 强制nc只能使用IPv4地址。
-6 强制nc只能使用IPv6地址。
-D 在socket上开启debugging功能
-d 不从标准输入中读取任何消息
-h 帮助选项
-i interval
在文本行之间的发送或接受,指定一个延迟时间间隔。 也会产生多个端口间的连接有延迟时间。
-k
强制nc保持监听其他连接,在它当前的连接完成之后。 如果不和-l选项一起使用,会有错误。
-l
通常用来指定nc监听,而不是创建一个连接到远程主机。 如果不与-p, -s或者-z选项一起使用的话,会有错误。另外,如果用-w指定超时选项的话,会被忽略。
-n
不使用DNS或者服务不做任何地址,主机名或者端口的查询
-p source_port
指定nc使用的源端口,来服从权限约束和授权。与-l选项一起使用会产生错误。
-r
指定源 和/或 目的端口是随机选择的,而不是系统按照一个范围或者顺序分配的。
-S
开启RFC 2385 TCP MD5签名选项。
-s source_ip_address
指定发送包的IP接口,与-l选项使用会有错误。
-T ToS
为连接指定IP的服务类型(ToS)。有效的值是令牌“lowdelay”, “throughput”, “reliability”, 或者以“0x”开头的8位的十六进制值。
-C 发送CRLF做为行尾符
-t
让nc发送RFC 854 不要和将不要响应RFC 854要或者将要的请求。这使得nc可以脚本化telnet会话过程。
-U 使用Unix Domain Sockets
-u 使用UDP替代默认的TCP选项
-v 详细信息输出模式
-w timeout
如果连接和标准输入空闲时间超过了超时时间(单位秒),那么连接就好被静默关闭。-w标志对-l选项没影响,比如nc将要永久监听一个连接,使用或者不使用-w标志都可以。默认是没有超时的。
-X proxy_version
与代理服务器交互时的请求,nc必须使用指定的协议。支持的协议是“4” (SOCKS v.4), “5” (SOCKS v.5)和“connect” (HTTPS proxy)。 如果协议不指定,SOCKS版本5将被使用。
-x proxy_address[:port]
请求时,nc必须连接一个使用代理地址和端口的代理做为主机名。如果端口没有被指定,那么众所周知的端口将为代理协议所使用(1080 for SOCKS, 3128 for HTTPS)
-z
指定nc只是扫描监听进程,不发送任何数据给它们。 与-l选项一起使用会有错误。
主机名可以是IP地址或者字符的主机名(除非使用了-n选项)。通常一个主机名必须被指定的(没有指定主机名的都会使用localhost),除非使用了-l选项。
端口可以是单独一个整数或者一个范围。 范围是nn-mm这种格式。通常一个目的端口必须被指定,除非使用了-U选项(这种情况下是指定了socket了)
客户端/服务端 模式
使用nc来构造一个基本的客户端/服务端 模式是很简单的。
在一个控制台,使用nc监听一个指定端口。
例如:
$ nc -l 1234
nc此刻就监听了1234端口。在第二个控制台(或者第二台机器上),连接到监听的机器和端口上:
$ nc 127.0.0.1 1234
端口间就会有个连接了。第二个控制端上面的任何输入都会传送到第一个上面,反之亦然。
在连接被建立之后,nc是不管哪边是服务端哪边是客户端的。使用EOF(‘^D’)可以中断连接。
数据传输
上面的章结可以扩展来构建一个基本的数据传输模式。 在其中一个连接端的任何信息的输入都可以在另外一端输出,而去输入和输出都可以被轻松的捕捉来模拟文件传输。
使用nc监听一个端口,捕捉到的输出重定向到一个文件中。$ nc -l 1234 > filename.out
第二台机器,连接到nc进程,导入一个文件数据来传输。$ nc host.example.com 1234
文件传输完成之后,连接会被自动关闭的。
服务交互
有时候手动与服务器交互相比较使用用户接口是比较有用的。在troubleshooting的时候很有帮助。比如,接收web站点的主页时:
$ echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
这也会显示web服务器发送的头部信息。如果需要的话是可以过滤的,使用比如sed这类命令
当用户指定服务器需要的请求格式时,可以构建更加复杂的例子,比如,提交到SMTP服务器的内容:$ nc [-C] localhost 25 <
HELO host.example.com
MAIL FROM:
RCPT TO:
DATA
Body of email.
.
QUIT
EOF
端口扫描
可以用来了解目标机器上哪些端口是打开的或者服务在运行。-z标志告诉nc报告打开的端口,而不是初始化一个连接。比如:$ nc -z host.example.com 20-30
Connection to host.example.com 22 port [tcp/ssh] succeeded!
Connection to host.example.com 25 port [tcp/smtp] succeeded!
端口范围被指定限制在20-30端口之间去搜索
可选择的,可以获取到指定服务器有哪些软件在运行,是什么版本。这些信息通常包括在问候条里面。为了获取这些信息,先得建立一个连接,然后在条目信息被获取到的时候关闭这个连接。使用-w可以指定超时,或者可以使用"QUIT"来结束。$ echo "QUIT" | nc host.example.com 20-30
SSH-1.99-OpenSSH_3.6.1p2
Protocol mismatch.
220 host.example.com IMS SMTP Receiver Version 0.84 Ready
例子
打开host.example.com的42端口建立TCP连接,使用端口31337做为源端口,超时5秒$ nc -p 31337 -w 5 host.example.com 42
建立与host.example.com的53端口的UDP连接$ nc -u host.example.com 53
使用本地ip为10.1.2.3与host.example.com的42端口建立连接:$ nc -s 10.1.2.3 host.example.com 42
使用Unix Domain Socket创建和监听:$ nc -lU /var/tmp/dsocket
通过10.2.3.4的8080端口做为HTTP代理,与host.example.com的42端口建立连接。这个例子通常被ssh来使用。$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42