Skip to content

Commit

Permalink
Add a range option to server to specify specific port client attribution
Browse files Browse the repository at this point in the history
  • Loading branch information
Olivier MICHAUD committed Sep 30, 2020
1 parent 18b4811 commit dbba723
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 4 deletions.
5 changes: 5 additions & 0 deletions bin/server
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ const argv = optimist
default: 10,
describe: 'maximum number of tcp sockets each client is allowed to establish at one time (the tunnels)'
})
.options('range', {
default: null,
describe: 'will bind incoming connections only on ports in range xxx:xxxx'
})
.argv;

if (argv.help) {
Expand All @@ -42,6 +46,7 @@ const server = CreateServer({
max_tcp_sockets: argv['max-sockets'],
secure: argv.secure,
domain: argv.domain,
range: argv.range,
});

server.listen(argv.port, argv.address, () => {
Expand Down
4 changes: 4 additions & 0 deletions lib/ClientManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Debug from 'debug';

import Client from './Client';
import TunnelAgent from './TunnelAgent';
import PortManager from "./PortManager";

// Manage sets of clients
//
Expand All @@ -13,6 +14,7 @@ class ClientManager {

// id -> client instance
this.clients = new Map();
this.portManager = new PortManager({range: this.opt.range||null})

// statistics
this.stats = {
Expand All @@ -39,6 +41,7 @@ class ClientManager {

const maxSockets = this.opt.max_tcp_sockets;
const agent = new TunnelAgent({
portManager: this.portManager,
clientId: id,
maxSockets: 10,
});
Expand Down Expand Up @@ -79,6 +82,7 @@ class ClientManager {
if (!client) {
return;
}
this.portManager.release(client.agent.port);
--this.stats.tunnels;
delete this.clients[id];
client.close();
Expand Down
15 changes: 11 additions & 4 deletions lib/TunnelAgent.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ class TunnelAgent extends Agent {

// sockets we can hand out via createConnection
this.availableSockets = [];
this.port = null;
this.clientId = options.clientId
this.portManager = options.portManager || null;

// when a createConnection cannot return a socket, it goes into a queue
// once a socket is available it is handed out to the next callback
Expand Down Expand Up @@ -63,13 +66,14 @@ class TunnelAgent extends Agent {
});

return new Promise((resolve) => {
server.listen(() => {
const port = server.address().port;
this.debug('tcp server listening on port: %d', port);
const port = this.portManager ? this.portManager.getNextAvailable(this.options.clientId) : null;
server.listen(port,() => {
this.port = server.address().port
this.debug('tcp server listening on port: %d (%s)', this.port, this.clientId);

resolve({
// port for lt client tcp connections
port: port,
port: this.port,
});
});
});
Expand Down Expand Up @@ -115,6 +119,9 @@ class TunnelAgent extends Agent {
socket.once('error', (err) => {
// we do not log these errors, sessions can drop from clients for many reasons
// these are not actionable errors for our server
if(this.portManager){
this.portManager.release(this.port);
}
socket.destroy();
});

Expand Down

0 comments on commit dbba723

Please sign in to comment.