2011-06-27 49 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并压缩? –