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);
}
}
效果演示

相关文章: