美文网首页
NodeJS编写简单TCP/UDP端口代理转发服务

NodeJS编写简单TCP/UDP端口代理转发服务

作者: 关爱单身狗成长协会 | 来源:发表于2019-09-25 15:48 被阅读0次

上周末整理电脑的数据,发现了一段早前用Python编写的端口转发服务,那时候是学习socket编写的。以前写的代码写的真的是...
于是打算用NodeJs重新编写。编写端口转发服务也是挺简单的,原理就是开个监听服务,服务接受到数据的时候,创建一个客户端,通过客户端转发到被代理的服务上,客户端接受到响应的时候再将数据返回给监听服务进行发送。

编写TCP端口代理

var net = require('net');
//获取本地时间字符串
function getDateStr() {
    return (new Date()).toLocaleString();
}
// 创建TCP代理
function proxyTCP(key, conf) {
    let [bind, server] = [conf.bind, conf.server];
    let tcpServer = net.createServer((c) => {
        console.info(`[${getDateStr()}] [${key}] [INFO] - TCP Client connect ${c.remoteAddress}:${c.remotePort}`);
        let client = net.connect({ port: server[1], host: server[0] }, () => {
            c.pipe(client);
        });
        client.pipe(c);
        client.on('error', (err) => {
            console.error(`[${getDateStr()}] [${key}] [ERROR] - ${err}`);
            c.destroy();
        });
        c.on('error', (err) => {
            console.error(`[${getDateStr()}] [${key}] [ERROR] -  ${err}`);
            client.destroy();
        });
    });
    tcpServer.listen({ host: bind[0], port: bind[1], }, () => {
        console.info(`[${getDateStr()}] [${key}] [INFO] - TCP Server start ${bind[0]}:${bind[1]}`);
    });
    return tcpServer;
}

const proxyConfig = {
    "测试机 1.21": {
        mode: "tcp",
        bind: ["0.0.0.0", 8087],
        server: ['192.168.1.21', 9003]
    },
    "远程桌面 1.21": {
        mode: "tcp",
        bind: ["0.0.0.0", 13389],
        server: ['192.168.1.21', 3389]
    },
    "路由器 1.1": {
        mode: "tcp",
        bind: ["0.0.0.0", 8080],
        server: ['192.168.1.1', 80]
    }
};

const servers = {};

for (let k in proxyConfig) {
    let conf = proxyConfig[k];
    if (conf.mode == "tcp") {
        servers[k] = proxyTCP(k, conf);
    }
}

添加UDP端口代理

const net = require('net');
const dgram = require('dgram');
//获取本地时间字符串
function getDateStr() {
    return (new Date()).toLocaleString();
}
// 创建TCP代理
function proxyTCP(key, conf) {
    let [bind, server] = [conf.bind, conf.server];
    let tcpServer = net.createServer((c) => {
        console.info(`[${getDateStr()}] [${key}] [INFO] - TCP Client connect ${c.remoteAddress}:${c.remotePort}`);
        let client = net.connect({ port: server[1], host: server[0] }, () => {
            c.pipe(client);
        });
        client.pipe(c);
        client.on('error', (err) => {//read ECONNRESET 主动中断
            console.error(`[${getDateStr()}] [${key}] [ERROR] - ${err}`);
            c.destroy();
        });
        c.on('error', (err) => {
            console.error(`[${getDateStr()}] [${key}] [ERROR] -  ${err}`);
            client.destroy();
        });
    });
    tcpServer.listen({ host: bind[0], port: bind[1] }, () => {
        console.info(`[${getDateStr()}] [${key}] [INFO] - TCP Server start ${bind[0]}:${bind[1]}`);
    });
    return tcpServer;
}
// 创建UDP代理
function proxyUDP(key, conf) {
    let [bind, server] = [conf.bind, conf.server];
    const serverUDP = dgram.createSocket('udp4');
    serverUDP.on('error', (err) => {
        console.error(`[${getDateStr()}] [${key}] [ERROR] - ${err}`);
    });
    serverUDP.on('message', (msg, rinfo) => {
        console.info(`[${getDateStr()}] [${key}] [INFO] - UDP Client connect ${rinfo.address}:${rinfo.port} `);
        let client = dgram.createSocket('udp4');
        client.on('error', (err) => {
            console.error(`[${getDateStr()}] [${key}] [ERROR] - ${err}`);
            client.close();
        });
        client.on('message', (fbMsg, fbRinfo) => {
            serverUDP.send(fbMsg, rinfo.port, rinfo.address, (err) => {
                if (err) console.error(`[${getDateStr()}] [${key}] [ERROR] - ${err}`);
            });
            client.close();
        });
        client.send(msg, server[1], server[0], (err) => {
            if (err) {
                console.error(`[${getDateStr()}] [${key}] [ERROR] - ${err}`);
                client.close();
            }
        });
    });
    serverUDP.bind(bind[1], bind[0], () => {
        console.info(`[${getDateStr()}] [${key}] [INFO] - UDP Server start ${bind[0]}:${bind[1]}`);
    });
    return serverUDP;
}

const proxyConfig = {
    "http": {
        mode: "tcp",
        bind: ["0.0.0.0", 8087],
        server: ['192.168.1.1', 80]
    },
    "dns": {
        mode: "udp",
        bind: ["0.0.0.0", 53],
        server: ['118.118.118.118', 53]
    },
    "远程": {
        mode: "tcp",
        bind: ["0.0.0.0", 13333],
        server: ['192.168.1.17', 3389]
    },
};
const servers = {};
for (let k in proxyConfig) {
    let conf = proxyConfig[k];
    if (conf.mode == "tcp") {
        servers[k] = proxyTCP(k, conf);
    } else if (conf.mode == "udp") {
        servers[k] = proxyUDP(k, conf);
    }
}

效果演示

效果演示

相关文章:

相关文章

  • NodeJS编写简单TCP/UDP端口代理转发服务

    上周末整理电脑的数据,发现了一段早前用Python编写的端口转发服务,那时候是学习socket编写的。以前写的代码...

  • nginx负载均衡和http代理与tcp-udp代理

    nginx自1.9.0开始提供tcp/udp的反向代理功能 web负载和代理 tcp/udp端口代理

  • 传输层

    传输层的功能:传输层寻址和端口;无连接服务和面向连接服务 UDP协议:UDP数据报,UDP校验 TCP段:TCP连...

  • 趣谈网络协议听课笔记

    TCP/UDP处于运输层 UDP UDP报文比较简单:主要包含有源端口号和目的端口号。从而也看出UDP简单粗暴,只...

  • TCP 与 UDP

    TCP 与 UDP(主要说TCP)TCP/UDP端口号TCP/UDP端口号TCP连接的建立TCP连接的建立发送se...

  • TCP、UDP协议测试

    基于Nodejs、socket.io,开发了TCP和UDP服务平台,帮助大家做TCP和UDP协议的测试 在做硬件终...

  • 攻击sqlserver

    首先通过UDP1434端口,查询Sql server服务的TCP动态端口 msf > use auxiliary/...

  • 搭建内网穿透服务NPS

    介绍 NPS是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、...

  • NPS

    简介 NPS是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、...

  • frp+远程连接,使用udp协议使界面更流畅

    本文参考:frp同时转发远程桌面的 TCP 和 UDP 端口[https://zhuanlan.zhihu.com...

网友评论

      本文标题:NodeJS编写简单TCP/UDP端口代理转发服务

      本文链接:https://www.haomeiwen.com/subject/wyxwuctx.html