在两台网络服务器

时间:2016-12-07 14:13:56

标签: node.js

鉴于下面的示例脚本,我正在将一个TCP连接从一个服务器连接到另一个服务器,这很好。

net = require "net"
log = console.log

# This server needs to receive custom data eg. (remoteAddress or an uuid)
target = net.createServer (socket) ->
  log('Target connection from ' + socket.remoteAddress)
target.listen(10000, '0.0.0.0', () -> log('Target ready'))

# User-facing server that pipes to the target server
front = net.createServer (socket) ->
  log('Front connection from ' + socket.remoteAddress)
  socket.on 'data', (data) ->
    socket.proxy = net.createConnection 10000, () ->
      socket.proxy.write(data)
      socket.pipe(socket.proxy).pipe(socket)

front.listen(8006, '0.0.0.0', () -> log('Front ready'))

我面临的问题是我需要将原始套接字的IP地址(例如socket.remoteAddress)传递给另一台服务器。 它不需要覆盖目标的socket.remoteAddress,只需要以某种方式检索原始IP。

以下是我对此进行测试的方法:

$ telnet 172.0.0.50 8006
Trying 172.0.0.50...
Connected to 172.0.0.50.
Escape character is '^]'.
SendingData

导致:

Target ready
Front ready
Front connection from 172.0.0.1
Target connection from 127.0.0.1

请注意target服务器收到front服务器的IP地址,我完全理解原因。

遗憾的是,我无法使用data,因为它可能已被客户完全加密。

2 个答案:

答案 0 :(得分:1)

另一种更简洁的方法可能是您可以在socket.proxy连接期间发送实际的remoteAddress,然后在目标服务器上记住它。这样,您就不必为数据增加开销。

同样在您的原始代码中,您正在为每个'数据上的目标服务器建立新的套接字连接。事件。我不认为它是故意的,但是这样,如果流量很高,你很快就会达到打开文件限制。

因此,我建议您在与前端服务器建立新的套接字连接时,只与目标服务器建立套接字连接一次。之后,您的代码应如下所示:

var net = require("net");
const log = console.log;

target = net.createServer(function(socket) {
  log('Target connection from ' + socket.remoteAddress);
  socket.once('data', function(data){
    socket.id = data.toString(); // Now, use socket.id whenever you want at the target server.
  });
});

target.listen(10000, '0.0.0.0', function() {
  log('Target ready');
});

var front = net.createServer(function(socket) {
  log('Front connection from ' + socket.remoteAddress);
  socket.proxy = net.createConnection(10000, function() {
    socket.proxy.write(socket.remoteAddress);
  });
  socket.pipe(socket.proxy).pipe(socket);
});

front.listen(8006, '0.0.0.0', function() {
  log('Front ready');
});

要检查与服务器的连接数,可以使用server.getConnections。通过这种方式,您可以防止事情走出界限。

希望这有帮助。

答案 1 :(得分:0)

更多地考虑一个不需要对数据进行迂回的解决方案,有一个重要的事实,即两个服务器都知道打开到目标的连接的套接字端口。哪个是前连接套接字的socket.localPort和目标服务器套接字的socket.remotePort

这一事实使得构建端口/ ip映射成为可能:

net = require "net"
log = console.log

portMap = {}

# This server needs to receive custom data eg. (remoteAddress or an uuid)
target = net.createServer (socket) ->
  socket.once 'data', (data) ->
    socket.id = portMap[socket.remotePort]
    log('Target connection from ' + socket.id);

target.listen(10000, '0.0.0.0', () -> log('Target ready'))

# User-facing server that pipes to the target server
front = net.createServer (socket) ->
  log('Front connection from ' + socket.remoteAddress)
  socket.once 'data', (data) ->
    socket.proxy = net.createConnection 10000, () ->
      portMap[socket.proxy.localPort] = socket.remoteAddress;
      socket.proxy.write(data)
      socket.pipe(socket.proxy).pipe(socket)

front.listen(8006, '0.0.0.0', () -> log('Front ready'))