netcat,nc小介绍

原文链接:http://eatdrinkmanwoman.spaces.live.com/blog/cns !97719476F5BAEDA4!1234.entry
---------------- 转载开始 -------------------
netcat,nc小介绍
 
netcat,简称为nc,是一个非常有用的网络小工具,也被称作网络安全工具中的瑞士军刀,它有两个主要的分支,你需要注意的是所使用的nc 能否使用-e选项(在编译时是否打开了-DGAPING_SECURITY_HOLE宏);-l与-p是否能同时使用。

对于它的名字,我没有查到具体的说明,但觉得是取自cat指令的命名方式(cat - concatenate files and print on the standard output),意思是网络版的cat命令。
manual中对nc是这样描述的:
     The nc (or netcat) utility is used for just about anything under the sun
     involving TCP or UDP.  It can open TCP connections, send UDP packets,
     listen on arbitrary TCP and UDP ports, do port scanning, and deal with
     both IPv4 and IPv6.  Unlike telnet(1), nc scripts nicely, and separates
     error messages onto standard error instead of sending them to standard
     output, as telnet(1) does with some.
     Common uses include:
           *  simple TCP proxies
           *  shell-script based HTTP clients and servers
           *  network daemon testing
           *  a SOCKS or HTTP ProxyCommand for ssh(1)
           *  and much, much more

搜索了nc的一些用法,将它们罗列一下。
 
1.点对点聊天
  PC1的IP地址假设是10.10.10.20,使用以下指令在1234端口监听
      $ nc -l 1234
  PC2使用以下指令连接到PC1
      $ nc 10.10.10.20 1234
  接下来在任一方的输入(按回车发送),都会立刻显示在对方的终端上。
  直到输入EOF标志(^D)连接终止。

2.文件传送
  PC1的IP地址假设是10.10.10.20,使用以下指令在1234端口监听,准备重定向接收保存文件
      $ nc -l 1234 > wall-e.mp4
  PC2使用以下指令开始传送文件
      $ nc 10.10.10.20 1234 < wall-e.mp4
  或者
      $ cat wall-e.mp4 | nc 10.10.10.20 1234
  这种方法的缺点是,假设你知道要传送的是什么东西,毕竟得给它取个文件名。
  至于传送的可靠性和文件的完整性大可放心,而且它真是小巧方便。

3.文件系统/分区迁移
  把文件传送功能发挥到极致的就是文件系统迁移了。
  假设你有一台PC2,这可能是一台新PC,想把PC1上的内容复制过去,最好能把整个硬盘的某一分区全部送过去。
  两台PC最好在同一个有线局域网下,这样传送速度才比较快。至于PC2,它有没有安装操作系统不重要,是不是Linux系统不重要,你可以让它运行一个 live cd动起来,这样不就有nc了嘛。
  这里假设PC1的IP地址假设是10.10.10.10,PC2的IP地址假设是10.10.10.30
 
  a.传送某一分区
  在PC2(目标主机)运行
      $ cd /mnt/sda1
      $ netcat -l -p 3333 | tar x
  在PC1(源主机)运行
      $ cd /mnt/sda1
      $ tar cf - * | netcat 10.10.10.30 3333
  ``-'' 符号,代表标准输入或者标准输出(stdin/stdout),因为用管道的话没必要再把tar包的内容存储在磁盘中。(关于管道和FIFO,可以参见这个链接,作者把有名管道和nc用得有趣极了。http://www.debian-administration.org/articles/145
  ``*''符号,表示当前目录下所有文件,也可以用"."代替。
  你还可以这样做
  在PC1(源主机)运行
      $ cd /mnt/sda1
      $ tar -czpsf - . | pv -b | nc -l 3333
  在PC2(目标主机)运行
      $ cd /mnt/sda1
      $ nc 10.10.10.10 3333 | pv -b | tar -xzpsf -
  或许你会觉得吃惊,怎么和第一种方法,使用-l选项的监听方调换了。实际上都可以的。nc并没有很明显的客户端与服务器的区别。这两种方法,数据传送的流向是不变的。
  这里的方法还用到了压缩(-z选项),一种说法是,没必要压缩,机器的性能反而成为瓶颈,只会让事情变慢。我也同意。
  pv指令是用来显示管道中数据传送的进度,-b是显示已传送的字节数。(fedora 10默认没有安装,请yum install pv)。在实际使用中我发现,加了pv后,nc有时候传送数据到一半的时候会停滞,原因不明。
 
  b.传送整个磁盘
  在PC2(目标主机)运行
      $ nc -l 3333 | dd of=/dev/sda
  在PC1(源主机)运行
      $ dd if=/dev/sda | nc 10.10.10.30 3333
  使用nc进行文件系统迁移,效果究竟如何呢?可以看看这篇blog。
  http://www.4bcj.com/post/2008/01/25/Fast-File-Copy-Linux !.aspx

4.简单的web服务器
  这个shell脚本片段将显示一个html页面,可以通过浏览器访问。(注意,1024以下端口需要root权限)
  while true;
  do nc -l 80 < somepage.html;
  done
 
  我想到的例子是,一个简单的文件下载服务页面。
  在有NBA的日子里,我会从外网下载一些当日比赛,并且在校园网内将资源共享出来供别的同学下载。一般的做法是自己假设FTP服务器让别人访 问,但是管理 FTP有些麻烦,而且自己也不是长期开放,只是偶尔提供分流下载打个游击。在Windows下我用的是hfs,很方便地就能创造处一个发布 页面并提供下载服务。
  在Linux下就可以用nc了。
  首先编辑一个html页面somepage.html,内容如下:
 
 
脚本showpage.sh,以root身份运行(因为要监听80端口),显示以上页面
#!/bin/sh
while true;
do nc -l 80 < somepage.html;
done
 
脚本filetransfer.sh,真正提供文件传送
#!/bin/sh
while true;
 do nc -l 9090 < /home/atom/Videos/wall-e.mp4;
done
 
实际的效果就是这样


5.端口扫描
  扫描主机host.example.com上端口20到30是否开放tcp服务
  nc -z host.example.com 20-30
  扫描主机host.example.com上端口20到30是否开放udp服务
  nc -z -u host.example.com 20-30
  这种扫描方式很容易被发现,虽然可以加个-i参数控制一下扫描间隔。要想专业扫描还是使用nmap吧。

6.talking to servers
 与服务器对话,自己输入构造要发送的报文内容来和服务器交互,尤其是报文内容是明文(text)的http协议。
  反过来说,nc也是一种进行网络协议学习的工具,通过nc直观地查看甚至介入报文交互的协议过程。尤其是自己编写了一个客户端服务器程序,运行起来没有达到预期效果,可以用nc来测试问题在什么地方。
  最好同脚本结合在一起,毕竟手工录入实在太慢了。http://www.jfranken.de/homepages/johannes/vortraege/netcat.en.html 有一些例子可供观摩(题外话,这个人的blog很不错)。
  当然,这些事情也可以用tcpdump、wireshark等来实现,但是nc有它的特色。
 
  例子一,自己构造GET方法连接到126.com
  这里捏造了一个并不存在的浏览器mybrowser
  EOF后面就是接收到的来自服务器的200OK应答报头以及实际内容(网页源代码)
 
 
  例子二,观察SIP的INVITE报文内容
  伪装成一个sip UA
  [atom@kingdom shell]$ nc -lu 5060
  用linphone去呼叫它
  接下来终端就输出了SIP INVITE报文内容
INVITE sip:atom@10.10.104.201 SIP/2.0
Via: SIP/2.0/UDP 10.10.104.179:5060;rport;branch=z9hG4bK506949094
From: <sip:michael@10.10.104.179>;tag=1983242749
To: <sip:atom@10.10.104.201>
Call-ID: 1450468314
CSeq: 20 INVITE
Contact: <sip:michael@10.10.104.179:5060>
Content-Type: application/sdp
Max-Forwards: 70
User-Agent: Linphone/2.0.1 (eXosip2/3.0.3)
Subject: Phone call
Expires: 120
Content-Length:   486
v=0
o=michael 123456 654321 IN IP4 10.10.104.179
s=A conversation
c=IN IP4 10.10.104.179
t=0 0
m=audio 7078 RTP/AVP 111 110 0 3 8 101
a=rtpmap:111 speex/16000/1
a=rtpmap:110 speex/8000/1
a=rtpmap:0 PCMU/8000/1
a=rtpmap:3 GSM/8000/1
a=rtpmap:8 PCMA/8000/1
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-11
m=video 9078 RTP/AVP 97 98 99 100
a=rtpmap:97 theora/90000
a=rtpmap:98 H263-1998/90000
a=fmtp:98 CIF=1;QCIF=1
a=rtpmap:99 MP4V-ES/90000
a=rtpmap:100 x-snow/90000
(略)

7.代理
  更确切地说像是一个中继(relay),而不是字面上感觉的http代理上网那样。
  以下摘抄自netcat cheat sheet

To start, create a FIFO(named pipe) called backpipe:
$ cd /tmp
$ mknod backpipe p
 
Listener-to-Client Relay:
$ nc -l [LocalPort] 0<backpipe | nc [TargetIPaddr] [port] | tee backpipe
Create a relay that sends packets from the local port [LocalPort] to Netcat client connected to [TargetIPaddr] on port [port]
 
Listener-to-Listener Relay:
$ nc -l [LocalPort_1] 0<backpipe | nc -l [LocalPort_2] | tee backpipe
Create a relay that sends packets from any connection on [LocalPort_1] to any connection on [LocalPort_2]
 
Client-to-Client Relay:
$ nc [PreviousHopIPaddr] [port] 0<backpipe | nc [NextHopIPaddr] [port2] | tee backpipe
Create a relay that sends packets from the connection to [PreviousHopIPaddr] on port [port] to a Netcat client connected to [NextHopIPaddr] on port [port2]
 
有个想法,能否把nc作为一个rtp proxy,简单实现rtp的转发,感觉应该可以,但是手上还找不到3台PC来试一试。以前也曾想过能否让xinetd来做rtp转发这件事。
 

最后把搜集到的资料打个包,有兴趣的话可以下载。
http://cid-97719476f5baeda4.skydrive.live.com/self.aspx/.Public/nc%20tips.zip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值