一、服务端TCP监听端口
如果是tcp作为监听端口,很多人里面可以想到相应的方法,由于tcp三次握手协议,我们可以直接写一个客户端程序即可判断tcp端口是否监听。我们汇总几种方法:
1.tcp socket客户端编程
直接调用connect接口(unix),建链远端地址和端口,建链成功:在监听port;建链拒绝:表示未在监听
2.telnet命令
client:
[root@Node_B build]# telnet 10.228.113.185 8000
Trying 10.228.113.185...
Connected to 10.228.113.185 (10.228.113.185).
Escape character is '^]'.
ss
Hello,you are connected!
server:
[root@localhost test]# ./tcp_server
======waiting for client's request======
recv msg from client: ss
如果拒绝:
[root@Node_B build]# telnet 10.228.113.185 8001
Trying 10.228.113.185...
telnet: connect to address 10.228.113.185: Connection refused
telnet: Unable to connect to remote host: Connection refused
3.nc命令
client:
[root@Node_B build]# nc -vz 10.228.113.185 8000
Connection to 10.228.113.185 8000 port [tcp/irdmi] succeeded!
如果拒绝:
[root@Node_B build]# nc -vz 10.228.113.185 8001
nc: connect to 10.228.113.185 port 8001 (tcp) failed: Connection refused
二、服务端UDP监听端口
相对于TCP,UDP无法通过三次握手来判断端口是否启用,connect 接口链接UDP套接字和远端主机UDP绑定的地址和端口,无论远端是否绑定,connect均可以链接成功,同时 telnet也仅适用于TCP。
我们只能通过nc命令来判断。
我们做一个实验:
1)在服务端我们启用一个10.228.113.185,端口8888的udp端口
client:
[root@Node_B build]# nc -uvz 10.228.113.185 8888
Connection to 10.228.113.185 8888 port [udp/ddi-udp-1] succeeded!
server:
[root@localhost test]# ./udp_server
client:X
server:I have recieved 1 bytes data!client:X
server:I have recieved 1 bytes data!client:X
server:I have recieved 1 bytes data!client:X
server:I have recieved 1 bytes data!client:X
server:I have recieved 1 bytes data!
1.如果udp监听端口开启,在监听范围,就不会回复ICMP包
2.netcat会连续相监听端口发送五个探测包,udp报文数据区带一个字符’X’
3.如果没有收到目标主机的回复,netcat认为远端监听的端口开启
2)我们用nc探测没有开启服务的端口
client:
[root@Node_B build]# nc -uvz 10.228.113.185 8887
netcat向服务端发送了两个udp探测报文,远端立即回复了ICMP的报文,端口不可达
3)nc探测一个链路不通的端口
[root@Node_B build]# ping 10.228.113.186
PING 10.228.113.186 (10.228.113.186) 56(84) bytes of data.
From 10.228.113.90 icmp_seq=2 Destination Host Unreachable
From 10.228.113.90 icmp_seq=3 Destination Host Unreachable
From 10.228.113.90 icmp_seq=4 Destination Host Unreachable
From 10.228.113.90 icmp_seq=6 Destination Host Unreachable
From 10.228.113.90 icmp_seq=7 Destination Host Unreachable
From 10.228.113.90 icmp_seq=8 Destination Host Unreachable
^C
--- 10.228.113.186 ping statistics ---
9 packets transmitted, 0 received, +6 errors, 100% packet loss, time 8946ms
pipe 3
[root@Node_B build]# nc -uvz 10.228.113.186 8888
Connection to 10.228.113.186 8888 port [udp/ddi-udp-1] succeeded!
从实验来看,对端链路不通,但是nc工具任然认为8888端口开启,实际上我们无法确认对端是否开启,这就是这个nc工具的小bug,上面我们也说到如果没有收到目标主机的回复,netcat认为远端监听的端口开启,由于链路不通,这里也分两种情况:
1.如果nc探测的地址是在同一个子网下面,但是远端地址和本机不通,通过抓包发现,实际都没有发出来任何一个探测包,由于底层失败对端是同一个子网,但是学不到mac,所以没有发出任何报文
2.如果nc探测的地址不是在同一个子网下面,通过抓包发现,可以发出五个探测报文,由于不在一个网段,直接走默认网关,所以可以发出来探测报文。
4)nc+ping+traceroute组合使用来判断UDP监听端口
经过上面的一系列实验,发现使用nc工具探测udp监听端口,必须确保两个设备链路是否通畅,但是ping 包均是 ICMP 报文,即使链路正常,还是不能保证百分之百保证UDP报文一定能到达对端,因为还有极少数的路由器或者一些防火墙设备可能会丢去一些端口较大的 UDP 报文。因此,此时还要借助 traceroute 判断 UDP 包是否到达了远端主机。
三、nc工具常用方法
1、远程拷贝文件
从server1拷贝文件到server2上。需要先在server2上,,用nc激活监听,
server2上运行: nc -l 1234 > text.txt
server1上运行: nc 192.168.10.11 1234 < text.txt
注:server2上的监听要先打开
2、克隆硬盘或分区
操作与上面的拷贝是雷同的,只需要由dd获得硬盘或分区的数据,然后传输即可。
克隆硬盘或分区的操作,不应在已经mount的的系统上进行。所以,需要使用安装光盘引导后,进入拯救模式(或使用Knoppix工具光盘)启动系统后,在server2上进行类似的监听动作:
nc -l -p 1234 | dd of=/dev/sda
server1上执行传输,即可完成从server1克隆sda硬盘到server2的任务:
dd if=/dev/sda | nc192.168.10.11 1234
※ 完成上述工作的前提,是需要落实光盘的拯救模式支持服务器上的网卡,并正确配置IP。
3、端口扫描
可以执行:
nc -v -w 2 192.168.10.11 -z 21-24
nc: connect to 192.168.10.11 port 21 (tcp) failed: Connection refused
Connection to 192.168.10.11 22 port [tcp/ssh] succeeded!
nc: connect to 192.168.10.11 port 23 (tcp) failed: Connection refused
nc: connect to 192.168.10.11 port 24 (tcp) failed: Connection refused
-z后面跟的是要扫描的端口
4、保存Web页面
while true; do nc -l -p 80 -q 1 < somepage.html; done
5、模拟HTTP Headers
引用[root@hatest1 ~]# nc 80
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browserHTTP/1.1 200 OK
Date: Tue, 16 Dec 2008 07:23:24 GMT
Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8
Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/
Expires: 0
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Cache-Control: private, post-check=0, pre-check=0, max-age=0
Set-Cookie: oWn_sid=xRutAY; expires=Tue, 23-Dec-2008 07:23:24 GMT; path=/
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html
[......]
在nc命令后,输入红色部分的内容,然后按两次回车,即可从对方获得HTTP Headers内容。
6、聊天
nc还可以作为简单的字符下聊天工具使用,同样的,server2上需要启动监听:
server2上启动:# nc -l 1234
server1上传输:# nc 192.168.10.11 1234
这样,双方就可以相互交流了。使用Ctrl+D正常退出。
7、传输目录
从server1拷贝nginx-0.6.34目录内容到server2上。需要先在server2上,用nc激活监听,
server2上运行:# nc -l 1234 |tar xzvf -
server1上运行:# tar czvf - nginx-0.6.34|nc 192.168.10.11 123
8、用nc命名操作memcached
1)存储数据:printf “set key 0 10 6rnresultrn” |nc 192.168.10.11 11211
2)获取数据:printf “get keyrn” |nc 192.168.10.11 11211
3)删除数据:printf “delete keyrn” |nc 192.168.10.11 11211
4)查看状态:printf “statsrn” |nc 192.168.10.11 11211
5)模拟top命令查看状态:watch “echo stats” |nc 192.168.10.11 11211
6)清空缓存:printf “flush_allrn” |nc 192.168.10.11 11211 (小心操作,清空了缓存就没了)