我想知道是否有办法在本地网络的IP范围内扫描特定数量的开放端口。
从本质上讲,我在寻找nodejs
,以在不知道其IP地址的情况下找到特定类型的客户端。在这种情况下,在端口14150上侦听的RFID读取器。
我希望这次扫描能很快,所以我不希望每个IP地址之间有很长的超时时间。它们都应该很快发生,对于多达255个客户端的整个本地IP范围(不包括我自己的IP),可能在几秒钟内max。
我写的代码可以随心所欲,但速度慢得令人痛苦。。。我想看看如何通过快速连接,如果在20ms内无法连接到给定的IP,则退出。我想捕获阵列中的实际连接,然后将其用于其他目的。
var net = require('net'); // Required to create socket connections
var ip = 254; //IP address to start with on a C class network
function checkConnect () {
ip--;
var thisIP = '192.168.1.' + ip; //concatenate to a real IP address
var S = new net.Socket();
S.connect(80, thisIP);
if(ip > 0) { checkConnect(); }
S.on('connect', function () { console.log('port 80 found on ' + thisIP); });
S.on('error', function () { console.log('no such port on ' + thisIP); });
S.end();
}
checkConnect();
我为你做的https://github.com/eviltik/evilscan.(今天刚刚发布0.0.3版)
安装:
npm install -g evilscan
用法(端口列表+端口范围):
root@debian:~# evilscan --target=192.168.0.0/24 --port=21-446,5900 --concurrency=100 --progress
192.168.0.3:5900|open
192.168.0.26:53|open
192.168.0.26:111|open
192.168.0.26:81|open
192.168.0.26:23|open
Scanned 192.168.0.253:446 (100%)
提示:
对于非常快速的扫描,你可以玩"并发"参数,超过1000,但你必须首先更新你的linux的ulimit参数:
ulimit -u unlimited
希望得到帮助。
前面的答案都不符合我的要求。我找到了一种重量轻得多的替代品。有了这个解决方案,我很快就得到了解决方案。我的下一次升级将基于当前子网指定一系列主机。我想我会把它限制在前254个客户端,这样就不会太夸张了。这是代码:
//LLRP DEVICE SCANNER
var net = require('net'), Socket = net.Socket;
var checkPort = function(port, host, callback) {
var socket = new Socket(), status = null;
// Socket connection established, port is open
socket.on('connect', function() {status = 'open';socket.end();});
socket.setTimeout(1500);// If no response, assume port is not listening
socket.on('timeout', function() {status = 'closed';socket.destroy();});
socket.on('error', function(exception) {status = 'closed';});
socket.on('close', function(exception) {callback(null, status,host,port);});
socket.connect(port, host);
}
var LAN = '192.168.1'; //Local area network to scan (this is rough)
var LLRP = 5084; //globally recognized LLRP port for RFID readers
//scan over a range of IP addresses and execute a function each time the LLRP port is shown to be open.
for(var i=1; i <=255; i++){
checkPort(LLRP, LAN+'.'+i, function(error, status, host, port){
if(status == "open"){
console.log("Reader found: ", host, port, status);
}
});
}
您可以使用arp命令首先获取活动设备的列表。跳出框框思考;)你不必盲目地扫描所有的设备。
var child = require("child_process");
var async = require("async");
var net = require("net");
var os = require("os");
function scan(port, cb){
var hosts = {};
var result = [];
async.series([
function scan(next, c){
if(c == 1){
next(); return;
}
// scan twice because arp sometimes does not list all hosts on first time
child.exec("arp -n | awk '{print $1}' | tail -n+2", function(err, res){
if(err) cb(err);
else {
var list = res.split("n").filter(function(x){return x !== "";});
list.map(function(x){
hosts[x] = x;
});
}
scan(next, 1);
});
},
function(next){
// if you want to scan local addresses as well
var ifs = os.networkInterfaces();
Object.keys(ifs).map(function(x){
hosts[((ifs[x][0])||{}).address] = true;
});
// do the scan
async.each(Object.keys(hosts), function(x, next){
var s = new net.Socket();
s.setTimeout(1500, function(){s.destroy(); next();});
s.on("error", function(){
s.destroy();
next();
});
s.connect(port, x, function(){
result.push(x);
s.destroy();
next();
});
}, function(){
next();
});
}
], function(){
cb(null, result);
});
}
scan(80, function(err, hosts){
if(err){
console.error(err);
} else {
console.log("Found hosts: "+hosts);
}
});
您也可以使用arp扫描实用程序,它更可靠。但是arp扫描需要根访问才能工作,所以最好只使用arp。它几乎可以在每个linux盒子上使用。
我将从网站上发布教程代码:
var net = require('net');
// the machine to scan
var host = 'localhost';
// starting from port number
var start = 1;
// to port number
var end = 10000;
// sockets should timeout asap to ensure no resources are wasted
// but too low a timeout value increases the likelyhood of missing open sockets, so be careful
var timeout = 2000;
// the port scanning loop
while (start <= end) {
// it is always good to give meaningful names to your variables
// since the context is changing, we use `port` to refer to current port to scan
var port = start;
// we create an anonynous function, pass the current port, and operate on it
// the reason we encapsulate the socket creation process is because we want to preseve the value of `port` for the callbacks
(function(port) {
// console.log('CHECK: ' + port);
var s = new net.Socket();
s.setTimeout(timeout, function() { s.destroy(); });
s.connect(port, host, function() {
console.log('OPEN: ' + port);
// we don't destroy the socket cos we want to listen to data event
// the socket will self-destruct in 2 secs cos of the timeout we set, so no worries
});
// if any data is written to the client on connection, show it
s.on('data', function(data) {
console.log(port +': '+ data);
s.destroy();
});
s.on('error', function(e) {
// silently catch all errors - assume the port is closed
s.destroy();
});
})(port);
start++;
}