【问题标题】:Node.js - forward all traffic from port A to port BNode.js - 将所有流量从端口 A 转发到端口 B
【发布时间】:2011-09-23 08:53:08
【问题描述】:

我正在尝试将所有流量从端口 6999 转发到端口 7000(我知道我可以使用 iptables,但我的想法是使用 Node.js 进行一些数据包检查)。

这是我到目前为止的代码:

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 时,什么也没有出现。有人有什么建议吗?

非常感谢,

【问题讨论】:

    标签: javascript node.js portforwarding


    【解决方案1】:

    这是我的尝试:

    支持从命令行给出“from”和“to”,并支持远程机器。

    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)

    从 localhost:9001 转发 => localhost:80

    $ node proxy.js 9001 80
    

    或本地主机:9001 => 其他主机:80

    $ node proxy.js 9001 otherhost:80
    

    (这是基于安德烈的回答,谢谢!)

    【讨论】:

    • 这太棒了。谢谢!
    【解决方案2】:

    您需要在一侧有 createConnection。这是我用来转发流量的脚本

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

    【讨论】:

    • 你知道我将如何使用 node-compress 压缩传输吗?我的意思是,我怎么知道是压缩还是解压缩 s 或 d?我添加了这一行:gunzip.init();cli.write(gunzip.inflate(d)+gunzip.end()); 和这一行 gzip.init();cli.pipe(gzip.deflate(s)+gzip.end());,但我认为我的压缩/解压缩混淆了。非常感谢,
    • 不太清楚你的意思。您有流量 A B。为什么需要压缩?您的任务是“将数据从 A 转发到 B 并解压缩,将 B 转发到 A 并压缩”吗?
    【解决方案3】:

    你看过 Node.js 模块 Hoxy 吗?

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

    开发者自述文件中的简要说明:

    Hoxy 是 node.js 的网络黑客代理,供网络开发人员使用。使用 hoxy,您可以充当“中间人”,并根据一组条件规则在 HTTP 请求和响应流经时更改它们。作为一个正在运行的进程,hoxy 在其他方面表现得像一个独立的代理服务器。 Hoxy 的灵感是作为对 Firebug 等调试器的补充,它允许您操纵客户端运行时而不是底层的 HTTP 对话。

    这应该可以很好地工作,除非您正在寻找较低级别的数据包到数据包检查。

    【讨论】:

    • 您好,感谢您的回复。我现在只想看看Hoxy。我也希望使用 ImageMagick 压缩和下采样所有图像。它用于卫星链路...
    • 没问题 :) 如果这是您正在寻找的东西,或者您是否需要更细粒度的东西或 TCP 套接字而不是 HTTP 数据,请告诉我。在很多情况下,Hoxy 对我来说都是救命稻草。
    • 您不会知道我如何使用 Hoxy 提取所有图像,对吗?我想将它们全部压缩...我希望这足够简单...
    • 我必须仔细查看规则语法,但鉴于您可以同时更改请求和响应正文,我想这会相对容易做到。在这里查看规则语法:github.com/greim/hoxy/tree/master/rules
    猜你喜欢
    • 1970-01-01
    • 2019-08-30
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多