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

2019-09-25  本文已影响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);
    }
}

效果演示

效果演示

相关文章:

上一篇 下一篇

猜你喜欢

热点阅读