2013-02-22 25 views
9

Tôi muốn biết nếu có cách quét qua phạm vi IP của mạng nội bộ của tôi cho các cổng mở của một số cụ thể.Tôi có thể quét nhanh mạng cục bộ của mình để biết các cổng mở cụ thể không?

Về cơ bản tôi đang tìm kiếm nodejs để tìm khách hàng của một loại cụ thể mà không biết địa chỉ IP của họ. Trong trường hợp này, đầu đọc RFID nghe trên cổng 14150.

Tôi muốn quét này nhanh, vì vậy tôi không muốn thời gian chờ dài giữa mỗi địa chỉ IP. Tất cả chúng sẽ xảy ra khá nhanh, có thể trong vòng vài giây tối đa cho toàn bộ dải IP địa phương lên đến 255 khách hàng, ngoại trừ IP của riêng tôi.

Tôi đã viết mã làm những gì tôi muốn nhưng nó rất chậm ... Tôi muốn xem làm thế nào tôi có thể làm điều này nhanh hơn bằng cách lấp lánh thông qua các kết nối và nhận ra nếu kết nối không thể được thực hiện cho một IP nhất định trong vòng 20ms . Tôi muốn nắm bắt các kết nối thực tế trong một mảng mà tôi có thể sử dụng cho một mục đích khác.

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(); 
+1

Đây sẽ là một khởi đầu tốt: http://www.hacksparrow.com/a-port-scanner-in-node-js.html –

+0

Bạn cũng có thể xem https://github.com/danielzzz/node -checkchecker mã của ông có thể chỉ cho bạn đi đúng hướng – Jack

Trả lời

4

Không có câu trả lời nào trước đây thực sự hiệu quả theo cách tôi cần. Tôi tìm thấy một thay thế trọng lượng nhẹ hơn nhiều. Với giải pháp này, tôi nhận được giải pháp của tôi một cách nhanh chóng. Nâng cấp tiếp theo của tôi sẽ là chỉ định một loạt các máy chủ dựa trên mạng con hiện tại. Tôi tưởng tượng tôi sẽ muốn giới hạn điều này với 254 khách hàng đầu tiên vì vậy nó không quá mức cần thiết. Đây là mã:

//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); 
     } 
    }); 
} 
1

Thay vì chỉ đăng link (liên kết có thể đi chết tại một thời điểm), tôi sẽ gửi mã hướng dẫn ở đây từ trang web:

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++; 
} 
+0

Điều này quét cho các cổng mở trên một thiết bị cụ thể. Tôi cần tìm một cổng trên tất cả các thiết bị trên mạng. – clayperez

+0

Tôi không nghĩ rằng giải pháp này là không đồng bộ –

18

Tôi đã thực hiện điều đó cho bạn https://github.com/eviltik/evilscan. (Vừa phát hành v0.0.3 ngày nay)

Install:

npm install -g evilscan 

Cách sử dụng (danh sách cổng + phạm vi cảng):

[email protected]:~# 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%) 

Mẹo:

Đối quét rất nhanh, bạn có thể chơi với thông số "đồng thời" eter, hơn 1000, nhưng bạn phải cập nhật thông số ulimit của linux trước tiên:

ulimit -u unlimited 

Hy vọng điều này sẽ giúp.

+0

Công việc tuyệt vời. Tôi đang đi qua mã của bạn bây giờ. : D –

+0

Thư viện khá đẹp, được kiểm tra đơn vị. –

5

Bạn có thể sử dụng lệnh arp để nhận danh sách thiết bị còn hoạt động trước. Hãy suy nghĩ bên ngoài hộp;) Bạn không cần phải quét tất cả các thiết bị một cách mù quáng.

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); 
    } 
}); 

Bạn cũng có thể sử dụng tiện ích quét ARP đáng tin cậy hơn. Nhưng arp-scan cần quyền truy cập root để làm việc, vì vậy tốt hơn là chỉ sử dụng arp. Nó có sẵn trên khá nhiều hộp linux.

Các vấn đề liên quan