nodetcpproxy

nodetcpproxy 是在nodejs环境中运行的简易TCP转发服务器。

需求背景:

笔者在开发一款C/S架构的项目,C为Android移动客户端,S为Linux上C实现的服务器。
没有带公网IP的云主机,只有一台安装了VMware的笔记本。VMware中安装了Ubuntu15.04。
笔记本通过WiFi上网,因为XX原因,VMware的网络模式需要设置为NAT模式,因此Ubuntu中ifconfig得到的IP地址可能为192.168.45.133,笔记本VMware虚拟网卡地址为192.168.45.1,WiFi地址可能为10.65.195.129。
此时与笔记本在同一WiFi网络中的手机需要访问运行在笔记本虚拟机ubuntu中的服务器。
显然,手机端的服务器IP不能直接写192.168.45.133。因此笔者需要在笔记本Windows环境中运行一个TCP转发服务器。


虽然TCP转发服务器有hin多,但是笔记最近了解了nodejs相关的技术,觉得其事件驱动的网络模型hin好,代码简洁,性能不俗。于是参考了官方的API,折腾出了一个nodetcpproxy.js的东东,满足开发调试需求。

代码已经在Github开源https://github.com/uname/nodetcpproxy

测试:

首先要有nodejs环境,没有的话去这里下载。
首先根据实际情况设置本地和远程服务器IP/PORT,nodetcpproxy没有提供命令行参数,直接编辑位于源码开头的变量完成设置。
为验证工具是否可用,笔者为虚拟机中的sshd服务器设置个本地的代理。笔者的设置是这样的:

1
2
3
4
var LOCAL_ADDR  = "0.0.0.0";
var LOCAL_PORT = 8080;
var REMOTE_ADDR = "192.168.45.133";
var REMOTE_PORT = 22;

(往下翻看完整代码)

测试效果:

代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
var net = require("net");

var LOG_DATA = true;
var HEX_MODE = true;

var LOCAL_ADDR = "0.0.0.0";
var LOCAL_PORT = 8080;
var REMOTE_ADDR = "192.168.45.133";
var REMOTE_PORT = 22;

var server = net.createServer();
server.listen(LOCAL_PORT, LOCAL_ADDR);

data2print = function(data)
{

if(!HEX_MODE) {
return data.toString();
}

var hexStr = data.toString("hex")
var outStr = "";
for(var i in hexStr) {
if(i % 2 == 0) {
outStr += " "
}
if(i % 32 == 0) {
outStr += "\n>> ";
}
outStr = outStr + hexStr[i];
}

return outStr
}

logData = function(data)
{

if(LOG_DATA) {
console.log(data)
}
}

server.on("connection", function(client)
{

console.log("Client connected " + client.remoteAddress + ":" + client.remotePort);
var proxySocket = new net.Socket();
proxySocket.connect(REMOTE_PORT, REMOTE_ADDR, function() {
logData("Connected to remote -> " + REMOTE_ADDR + ":" + REMOTE_PORT);
});

proxySocket.on("close", function(data) {
console.log("Remote closed");
client.destroy();
});

proxySocket.on("data", function(data) {
logData("Remote -> Proxy -> Client:\n" + data2print(data));
client.write(data);
});

client.on("close", function(data) {
console.log("Client closed");
proxySocket.destroy();
});

client.on("error", function() {
console.log("**Client error");
proxySocket.destroy();
});

client.on("data", function(data) {
logData("Client -> Proxy -> Remote:\n" + data2print(data));
proxySocket.write(data);
});

});

console.log("TCP proxy server started on " + LOCAL_ADDR + ":" + LOCAL_PORT);