2011-06-27 47 views
16

我試圖將端口6999的所有流量轉發到端口7000(我知道我可以使用iptables,但想法是使用Node.js來做一些包檢查)。Node.js - 將端口A的所有流量轉發到端口B

這裏是我SOFAR代碼:

var net=require('net'); 
var compress=require('./node-compress/compress'); 

var ip='172.16.1.224'; 
var ipPort=6999; 
var opPort=7000; 

var output=net.createServer(function(connOut){ 
     var input=net.createServer(function(connIn){ 
       connIn.pipe(connOut); 
     }); 
     input.listen(ipPort,ip); 
}); 
output.listen(opPort,ip); 

它只是似乎沒有工作。當我在7000端口上執行tcpdump時,什麼也沒有顯示出來。任何人有任何建議?

提前許多感謝,

回答

25

這是我走在它的腳本:

支持給予「從」和「到」的命令行,並支持遠程機器。

var net = require('net'); 

// parse "80" and "localhost:80" or even "42mEANINg-life.com:80" 
var addrRegex = /^(([a-zA-Z\-\.0-9]+):)?(\d+)$/; 

var addr = { 
    from: addrRegex.exec(process.argv[2]), 
    to: addrRegex.exec(process.argv[3]) 
}; 

if (!addr.from || !addr.to) { 
    console.log('Usage: <from> <to>'); 
    return; 
} 

net.createServer(function(from) { 
    var to = net.createConnection({ 
     host: addr.to[2], 
     port: addr.to[3] 
    }); 
    from.pipe(to); 
    to.pipe(from); 
}).listen(addr.from[3], addr.from[2]); 

(保存爲的proxy.js)

爲了從本地主機轉發:9001 =>本地主機:80

$ node proxy.js 9001 80 

或本地主機:9001 => OTHERHOST:80

$ node proxy.js 9001 otherhost:80 

(這是基於安德烈的回答,謝謝!)

+0

這太棒了。謝謝! –

4

你有沒有看Node.js的模塊Hoxy?從開發者的自述

http://www.youtube.com/watch?v=2YLfBTrVgZU

簡單描述:

Hoxy是node.js的,旨在用於web開發者網絡黑客的代理服務器。使用hoxy,您可以充當「中間人」,並根據一組有條件的規則在HTTP請求和響應流經時改變它們。作爲一個正在運行的進程,hoxy會像獨立的代理服務器一樣運行。 Hoxy靈感來源於一種補充像Firebug這樣的調試器的方式,它可以讓你操縱客戶端運行時而不是底層的HTTP對話。

這應該工作得很好,除非您正在尋找更低級別的數據包到數據包檢查。

+0

嘿,謝謝你的回覆。我現在只想看看Hoxy。我也希望使用ImageMagick對所有圖像進行壓縮和縮減採樣。它用於衛星連接... – Eamorr

+0

沒問題:)讓我知道這是你正在尋找的東西,還是你需要更細粒度的東西,或者用於TCP套接字而不是HTTP數據。 Hoxy在很多情況下都是我的救星。 – slickplaid

+0

你不知道我會如何使用Hoxy提取所有圖像,對嗎?我想壓縮他們所有...我希望這是足夠簡單的做... – Eamorr

12

您需要在一側創建連接。下面是我用轉發流量

var net = require('net'); 

var sourceport = 1234; 
var destport = 1235; 

net.createServer(function(s) 
{ 
    var buff = ""; 
    var connected = false; 
    var cli = net.createConnection(destport); 
    s.on('data', function(d) { 
     if (connected) 
     { 
      cli.write(d); 
     } else { 
      buff += d.toString(); 
     } 
    }); 
    cli.on('connect', function() { 
     connected = true; 
     cli.write(buff); 
    }); 
    cli.pipe(s); 
}).listen(sourceport); 
+0

你知道我怎樣使用節點壓縮來壓縮傳輸嗎?我的意思是,我怎麼知道是壓縮還是解壓縮s或d?我已經添加了這一行:'gunzip.init(); cli.write(gunzip.inflate(d)+ gunzip.end());'和這一行'gzip.init(); cli.pipe(gzip.deflate (s)+ gzip.end());',但我想我得到我的壓縮/解壓混合。非常感謝, – Eamorr

+0

不太清楚你的意思。你有流量A <-> B.你爲什麼需要壓縮?您的任務是否將數據從A轉發到B並解壓縮,B到A並壓縮? –