-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathremote-desktop-https-server.js
111 lines (104 loc) · 4.25 KB
/
remote-desktop-https-server.js
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/// <reference path="C:\Users\liufha\typings\globals\node\index.d.ts" />
var https = require('https');
var fs = require('fs');
var url = require('url');
var options = {
key: fs.readFileSync('./keys/server-key.pem'),
ca: [fs.readFileSync('./keys/ca-cert.pem')],
cert: fs.readFileSync('./keys/server-cert.pem')
};
var desktop_client_port = 4020;//填入供反向客户Server端的client连接端口 //需要跟下面的client数组对应,应该是一个端口范围,比如800-5000,每次连接分配一个对应端口号
var remote_user_port = 8889;//填入服务端对外提供的远程桌面端口,远程桌面客户端需要连接到此端口
var desktop_client_ip = null;
var remote_user_ip = null;
function isIpv4(ip)
{
var re = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
return re.test(ip);
}
function getIpv4FromIpv6(ipAddrStr){
var addr_array = ipAddrStr.split(':');
if( addr_array[0] == '' && addr_array[1] == '' && addr_array[2] == 'ffff' ){
if( isIpv4(addr_array[3]) ){
return addr_array[3];
}
}
return null;
}
function ipToV4(ipAddrStr){
if( isIpv4(ipAddrStr) ){
return ipAddrStr;
}else{
return getIpv4FromIpv6(ipAddrStr);
}
}
https.createServer(options,function(req,res){
console.log(req.url,req.socket.remoteAddress);
if(req.url=='/desktop'){//因为使用了证书,所以能从https连接进来的终端是可靠的
desktop_client_ip = req.socket.remoteAddress;//req.headers.host;
console.log(desktop_client_ip);
}else if(req.url=='/remoteUser'){
remote_user_ip = req.socket.remoteAddress;//req.headers.host;
console.log(remote_user_ip);
}
res.writeHead(200);
res.end('auth finished!');
}).listen(49289,'come2see.me');//'10.61.41.49');//'127.0.0.1');//'10.61.115.22');10.61.41.49
function main() {
var net = require('net');
var desktop_client = null;//远程连接 //使用数组来存储众多客户Server端链接,根据端口号索引到数组元素client
var user_client = null;
net.createServer(function(socket) {//供反向客户端连接
console.log('socket.remoteAddress:',socket.remoteAddress);
rmt_addr = ipToV4(socket.remoteAddress);
dkp_addr = ipToV4(desktop_client_ip);
if(rmt_addr == dkp_addr || '127.0.0.1' == dkp_addr
|| '10.61.41.49' == dkp_addr){
console.log('socket.remoteAddress:',rmt_addr);
desktop_client = socket;
console.log('connection '+socket.remoteAddress+':'+socket.remotePort+' connected \n已连通,现在可以远程桌面连接到本机的'+remote_user_port+'端口了!');
socket.on('close', function() {
console.log('connection '+socket.remoteAddress+':'+socket.remotePort+' disconnected\n等待客户端连接中...');
delete(desktop_client);
});
socket.on('error',function(){
console.log('desktop connection error!');
});
}else{//connection already established
socket.end('need auth first!');
console.log('need auth first!');
}
}).listen(desktop_client_port, function() {
console.log('代理服务端已开启: '+desktop_client_port);
return;
});
net.createServer(function(socket) {//供代理远端用户连接
console.log(socket.remoteAddress, remote_user_ip);
if(!desktop_client) {//如果远端桌面还没有连接或者远端用户没有通过https验证,则结束远端用户连接
socket.end('Remote Desktop is not connected!');
console.log('Remote Desktop is not connected!');
return;
}
var rmt_addr = ipToV4(socket.remoteAddress);
var rmt_usr_addr = ipToV4(remote_user_ip);
if(rmt_addr!=rmt_usr_addr) {//如果远端桌面还没有连接或者远端用户没有通过https验证,则结束远端用户连接
socket.end('need auth first!');
console.log('need auth first!');
return;
}
socket.pipe(desktop_client);
desktop_client.pipe(socket);
socket.on('close', function() {
if(desktop_client)desktop_client.end('user connection closed!');
});
socket.on('error',function(){
if(desktop_client)desktop_client.end('user connection error!');
console.log('user connection error!');
});
}).listen(remote_user_port, function() {
console.log('本机远程桌面端口已开启:'+remote_user_port +'\n等待客户端连接中...');
});
process.title = '服务端';
return;
}
main();